在下面的程序中,我尝试使用数组arr
中的值填充BST。该程序似乎在循环中运行了很长时间,然后我得到一个分段错误。有人可以解释我在这里缺少的东西吗?
struct node {
int value;
struct node *left;
struct node *right;
};
void add(struct node **root, int i);
int arr[14] = {30, 50, 25, 32, 45, 55, 20, 27, 31, 43, 47, 52, 88};
int main(void)
{
struct node *root = malloc(sizeof(struct node));
root->value = 35;
root->left = NULL;
root->right = NULL;
struct node *start = root;
int i;
for (i = 0; i < 13; i++) {
add(&root, arr[i]);
root = start;
}
printf("%d\n", root->value);
printf("%p\n", root->right);
printf("%p\n", root->left);
}
void add(struct node **root, int i)
{
while ((*root) != NULL) {
printf("left: %p\n", (*root)->left);
if (i < (*root)->value) {
add(&((*root)->left), i);
} else {
add(&((*root)->right), i);
}
}
*root = malloc(sizeof(struct node));
(*root)->value = i;
(*root)->left = NULL;
(*root)->right = NULL;
}
答案 0 :(得分:3)
你正在使用递归,所以while
没有理由在那里。它应该是一个if-else逻辑结构:
void add(struct node **root, int i)
{
if (*root)
{
if (i < (*root)->value) {
add(&((*root)->left), i);
} else {
add(&((*root)->right), i);
}
}
else
{
*root = malloc(sizeof(struct node));
(*root)->value = i;
(*root)->left = NULL;
(*root)->right = NULL;
}
}
如果目标是消除递归,那么解决方案是使用while循环,但将root
向下移动直到它解决空节点:
void add(struct node **root, int i)
{
while(*root)
{
if (i < (*root)->value) {
root = &(*root)->left;
} else {
root = &(*root)->right;
}
}
*root = malloc(sizeof(struct node));
(*root)->value = i;
(*root)->left = NULL;
(*root)->right = NULL;
}
最后,main
中的for循环不必要地重复root
。正确完成该循环应该看起来像这样(假设目标是主机仅数组中的值):
int main(void)
{
struct node *root = NULL;
int i;
for (i = 0; i < 13; i++)
add(&root, arr[i]);
printf("%d\n", root->value);
printf("%p\n", root->right);
printf("%p\n", root->left);
}