Функция отображения двоичного дерева не работает должным образом - PullRequest
1 голос
/ 08 января 2020

Я создал программу для двоичного дерева. По какой-то причине я не могу отобразить его правильно. Пожалуйста, помогите мне написать в правильном формате. Вот код и, пожалуйста, дайте мне знать, если есть другие ошибки.

#include <iostream>
using namespace std;

class node
{
public:
    int data;
    node *left, *right;
    node(int x)
    {
        data = x;
        left = right = NULL;
    }
};
class tree
{
public:
    node *p;    
    node *create()
    {
        int x;
        cout << "Enter data(-1 for NULL): ";
        cin >> x;
        if(x == -1)
            return NULL;
        p = new node(x);
        cout << "Enter left child: ";
        p -> left = create();
        cout << "Enter right child: ";
        p -> right = create();
        return p;
    }
    void display1()
    {
        display(p);
    }
    void display(node *root)
    {
        if(root != NULL)
        {
            display(root -> left);
            cout << " " << root -> data << " ";
            display(root -> right);
        }
    }
};
int main()
{
    tree t;
    t.create();
    t.display1();
    return 0;
}

1 Ответ

0 голосов
/ 08 января 2020

Проблема заключается в вашей create() функции-члене. В частности, проблема заключается в строке p = new node(x);, поскольку p является элементом данных и должен указывать на root дерева, но вы назначаете его новому узлу при каждом рекурсивном вызове и, таким образом, фактически теряете узлы. на предыдущих рекурсивных вызовах. Это приводит к неправильному / неожиданному выводу при вызове функции display, поскольку p не указывает на root дерева.

Правильная реализация

node *create(){
    int x;
    cout << "Enter data(-1 for NULL): ";
    cin >> x;
    if(x == -1)
        return NULL;
    node* new_node = new node(x); // Create new node
    cout << "Enter left child: ";
    new_node -> left = create(); // Assign left child
    cout << "Enter right child: ";
    new_node -> right = create(); // Assign right child
    p = new_node; // Assign root of tree to p
    return new_node;
}
...