Проблема со вставкой в двоичное дерево поиска

#c #binary-tree #binary-search-tree #dynamic-programming

#c #двоичное дерево #binary-search-tree #динамическое программирование

Вопрос:

Я написал код для вставки в двоичное дерево поиска и его обхода.

 class node
{
public:
    int data;
    node *left;
    node *right;
};
node* createNode(int value)
{
    node *temp = new node;
    temp->data = value;
    temp->left = NULL;
    temp->right = NULL;
    return temp;
}

node *start = NULL;

void insertNode(int val)
{
    if (start == NULL)
    {
        start = createNode(val);
        return;
    }

    node *temp = start;
    while ((temp->left != NULL) amp;amp; (temp->right != NULL))
    {
        if (val < temp->data)
        {
            temp = temp->left;
        }
        else if (val > temp->data)
        {
            temp = temp->right;
        }
        else
        {
            cout << "Already exists in treen";
            return;
        }
    }
    if (val < temp->data)
    {
        temp->left = createNode(val);
        return;
    }
    else
    {
        temp->right = createNode(val);
        return;
    }


}

void inorder(node *root)
{
    if (root != NULL)
    {
        inorder(root->left);
        printf("%d n", root->data);
        inorder(root->right);
    }
}
 

Это не работает нормально в некоторых тестовых примерах.

Например, если вставить 15, 25 и затем 35, а затем пройти по дереву, то будут напечатаны только 15 и 25.

Я не могу найти проблему в коде. В чем проблема с моей логикой вставки?

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

1. вы, пока условие неверно.. отладьте его и посмотрите на вашу текущую древовидную структуру и почему тело while будет пропущено там, где оно не должно

Ответ №1:

Давайте рассмотрим поведение —


  1. вы вставляете 15. if (start == NULL)
    • эта проверка создает начальный узел. Теперь есть начальный узел со значением 15 и слева и справа как NULL .

  1. вы вставляете 25. (temp->left != NULL) amp;amp; (temp->right != NULL)
    • это оказывается ложным.
    • (val < temp->data) эта проверка создает правильный узел.

  1. вы вставляете 35. (temp->left != NULL) amp;amp; (temp->right != NULL)
    • по-прежнему оказывается false .
    • (val < temp->data) эта проверка создает правильный узел (заменяя текущий правый узел). А это неправильно.

Здесь необходимо исправить условие цикла while.