#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:
Давайте рассмотрим поведение —
- вы вставляете 15.
if (start == NULL)
- эта проверка создает начальный узел. Теперь есть начальный узел со значением 15 и слева и справа как
NULL
.
- эта проверка создает начальный узел. Теперь есть начальный узел со значением 15 и слева и справа как
- вы вставляете 25.
(temp->left != NULL) amp;amp; (temp->right != NULL)
- это оказывается ложным.
(val < temp->data)
эта проверка создает правильный узел.
- вы вставляете 35.
(temp->left != NULL) amp;amp; (temp->right != NULL)
- по-прежнему оказывается false .
(val < temp->data)
эта проверка создает правильный узел (заменяя текущий правый узел). А это неправильно.
Здесь необходимо исправить условие цикла while.