这似乎是一个简单的问题,我看了另一个线程,看起来我做的是同样的事情,但没有结果。
这是我的代码,迭代地插入二叉搜索树,以及结构和如何创建新节点:
typedef struct node {
int data;
struct node *left;
struct node *right;
} node;
node *create_node(int data) {
node *n = calloc(1, sizeof(node));
n->data = data;
return n;
}
node *BST_insert_iterative(node *root, int data) {
node *temp = root;
if (root == NULL)
return create_node(data);
while (temp != NULL) {
if (data > temp->data)
temp = temp->right;
else
temp = temp->left;
}
temp = create_node(data);
return root;
}
当我打印树时,我只收到第一个节点:
Inserting 8 into BST...
Inserting 50 into BST...
Inserting 74 into BST...
Inserting 59 into BST...
Inserting 31 into BST...
Inserting 73 into BST...
Inserting 45 into BST...
Inserting 79 into BST...
Inserting 24 into BST...
Inserting 10 into BST...
In order traversal
8
Height of tree: 0
但是,使用递归插入函数:
node *BST_insert(node *root, int data) {
if (root == NULL)
return create_node(data);
if (root->data >= data)
root->left = BST_insert(root->left, data);
else (root->data < data)
root->right = BST_insert(root->right, data);
return root;
}
它运作得很好,我得到了:
Inserting 8 into BST...
Inserting 50 into BST...
Inserting 74 into BST...
Inserting 59 into BST...
Inserting 31 into BST...
Inserting 73 into BST...
Inserting 45 into BST...
Inserting 79 into BST...
Inserting 24 into BST...
Inserting 10 into BST...
In order traversal
8
10
24
31
45
50
59
73
74
79
Height of tree: 4
答案 0 :(得分:3)
在插入功能中,不将新节点存储到树中。您只需存储到本地变量temp
并始终返回root
。
您必须保留指向要更新的链接的指针,以便将新节点插入树中或树的根目录中。这是一个修改版本:
typedef struct node {
int data;
struct node *left;
struct node *right;
} node;
node *create_node(int data) {
node *n = calloc(1, sizeof(node));
n->data = data;
n->left = n->right = NULL;
return n;
}
node *BST_insert_iterative(node *root, int data) {
node **pp = &root;
while (*pp != NULL) {
if (data > (*pp)->data)
pp = &(*pp)->right;
else
pp = &(*pp)->left;
}
*pp = create_node(data);
return root;
}
注意:
另请注意,递归函数在看起来像冗余测试时会出现语法错误。你应该这样简化:
node *BST_insert(node *root, int data) {
if (root == NULL)
return create_node(data);
if (root->data >= data) {
root->left = BST_insert(root->left, data);
} else {
root->right = BST_insert(root->right, data);
}
return root;
}
答案 1 :(得分:0)
Chqrlie的回答有效,但我想在不使用双指针的情况下做到这一点。
在意识到我的root没有连接到新创建的节点后,我能够做到这一点。
这是解决方案:
node *BST_insert_iterative(node *root, int data)
{
node *temp = root;
int condition = 1;
if (root == NULL)
return create_node(data);
while (condition)
{
if (data > temp->data)
{
if (temp->right == NULL)
{
temp->right = create_node(data);
condition = 0;
}
else
temp = temp->right;
}
else
{
if (temp->left == NULL)
{
temp->left = create_node(data);
condition = 0;
}
else
temp = temp->left;
}
}
return root;
}