Проблемы с функциями печати в двоичном дереве поиска

#c #binary-tree

#c #двоичное дерево

Вопрос:

Мое упражнение состоит в том, чтобы вставить элементы в BSTree и найти его максимальный элемент. После того, как я это сделал, он ничего не печатает и всегда возвращает 0. Я пробовал с функцией печати, но это было то же самое, я не знаю причины. Пожалуйста, помогите. Заранее спасибо………………………………………………………………………………………………………………………………………….

 #include <iostream>

using namespace std;

struct BstNode {
    int data;
    BstNode *left;
    BstNode *right;

    BstNode(int data1, BstNode *left1 = nullptr, BstNode *right1 = nullptr) : data(data1), left(left1), right(right1) {}

    ~BstNode() {}

};

class BinTree {
private:
    BstNode *root;
public:
    BinTree() : root(NULL) {}

    ~BinTree() {}

    BstNode *Insert(int data, BstNode *root) {
        if (root == NULL) {
            root = new BstNode(data);
            return root;
        }
        while (data <= root->data) {
            if (root->left == NULL) {
                root->left = new BstNode(data);
            }
            Insert(data, root->left);
        }
        while (data <= root->data) {
            if (root->right == NULL) {
                root->right = new BstNode(data);
            }
            Insert(data, root->right);
        }
    }

    int FindMax() {
        MaxHelper(root);
    }

    int MaxHelper(BstNode *root) {
        if (root == NULL) {
            cout << "List is empty  ";
            return -1;
        } else if (root->right != NULL) {
            root = root->right;
        }
        return root->data;
    }

    void Preorder(BstNode *root) { //DLR
        if (root == NULL) {
            return;
        }
        cout << root->data;
        Preorder(root->left);
        Preorder(root->right);
    }


};

BstNode *root = new BstNode(10);

int main() {

    BinTree b;
    cout << b.Insert(5, root);
    cout<<b.Insert(6, root);
    cout << b.Insert(7, root);
    cout << b.FindMax();

    return 0;
}
 

Комментарии:

1. BinTree::FindMax и BinTree::Insert обещают возвращать значения, но, похоже, не всегда выполняют обещание. Я бы обратился к этому, прежде чем продолжить.

2. Вас трудно понять, можете ли вы по-другому исправить то, что я должен исправить?

3. Любая непустотная функция всегда должна return что-то делать. Если это не так, у вас проблемы.

4. Я бы рекомендовал: 1- просмотр вашей программы с помощью отладчика. 2- попытка немного больше понять рекурсивность. 3- написание более простых рекурсивных задач, таких как факториал и последовательность Фибоначчи, перед выполнением этой.

5. Вся ваша программа неверна (где используется рекурсивность) Я пытался написать решение, но обнаружил, что мне следует переписать большую его часть.

Ответ №1:

Во-первых, вы должны включить комментарии в свой код, чтобы другие могли понять. И я нашел много ошибок в вашем коде.

Первое, на что следует обратить внимание, это то, что если у вас есть функция, не являющаяся пустой, она должна что-то возвращать.

И using namespace std; загрязняют пространство имен. Следовательно, используйте

 using std::cout;
using std::endl;
 

И нет необходимости иметь отдельную структуру, если вы используете классы в своем файле. Попробуйте реализовать это внутри класса.

И root == NULL может быть изменен как !root .

И ваша функция вставки имеет логические ошибки.

И если вы возвращаете что-то в операторе if, не нужно использовать else if, просто используйте if .

И лучше использовать два отдельных файла для основного и реализации и использовать его в качестве файла заголовка.

И защитите ваши заголовочные файлы от многократного включения.

И бла-бла-бла …;)

Здесь я исправил некоторые из ваших ошибок. но не все, попробуйте исправить их все самостоятельно.

 #include <iostream>

using std::cout;
using std::endl;

struct BstNode
{
    int data;
    BstNode *left;
    BstNode *right;

    BstNode(int data1) : data(data1), left(NULL), right(NULL){};

    ~BstNode(){};
};

class BinTree
{
private:
    BstNode *root;

public:
    BinTree() : root(NULL) {}

    ~BinTree() {}

    BstNode *Insert(int data, BstNode *root)
    {
        if (!root)
        {
            return new BstNode(data);
        }
        if (data > root->data)
        {
            root->right = Insert(data, root->right);
        }
        else
        {
            root->left = Insert(data, root->left);
        }

        return root;
    }

    int FindMax(BstNode *root)
    {
        return MaxHelper(root);
    }

    int MaxHelper(BstNode *root)
    {
        if (!root)
        {
            return -1;
        }
        if (root->right)
        {
            root = root->right;
        }
        return root->data;
    }

    void Preorder(BstNode *root)
    {
        if (!root)
            return;
        Preorder(root->left);
        cout << root->data << " ";
        Preorder(root->right);
    }
};

int main()
{

    BstNode *root = new BstNode(10);
    BinTree b;
    b.Insert(5, root);
    b.Insert(6, root);
    b.Insert(7, root);
    b.Insert(11, root);
    cout << b.FindMax(root) << endl;
    b.Preorder(root);

    return 0;
}