请帮我解决这个问题。我不断遇到seg故障! 我想使用递归来创建和插入一个新节点。 请帮我调试一下。
//Create a Binary Search Tree From an array.
struct Tree
{
int data;
struct Tree *lchild;
struct Tree *rchild;
};
struct Tree *root = NULL;
struct Tree *node(int val)
{
struct Tree *tempnode;
tempnode = (struct Tree*)malloc(sizeof(struct Tree));
tempnode->data = val;
tempnode->rchild = NULL;
tempnode->lchild = NULL;
return tempnode;
}
void createTree(struct Tree *curr, int val)
{
struct Tree *newnode = node(val);
if (curr == NULL)
curr = newnode;
else if(val < curr->data)
{
createTree(curr->lchild,val);
}
else if(val > curr->data)
{
createTree(curr->rchild,val);
}
else
printf("Error Similar data found\n");
}
void inorder(struct Tree *root)
{
if (root->lchild != NULL)
inorder(root->lchild);
printf("[%d] ",root->data);
if (root->rchild != NULL)
inorder(root->rchild);
}
int main()
{
// root = NULL;
int i = 0, arr[5] = {41,12,32,23,17};
for(i;i<5;i++)
createTree(root,arr[i]);
inorder(root);
return 0;
}
为什么我一直都会遇到段错误。有人可以解释一下吗? 我在做一些我不应该做的事吗?或者我在某个时候失踪了?
答案 0 :(得分:2)
树的根没有分配到任何地方;在您的函数createTree
中,您可能认为它已分配在:</ p>
if (curr == NULL)
curr = newnode;
但curr
是函数的本地函数,不会影响root
。您需要将参数curr
更改为指针指针,否则该函数不能用于分配根节点或子节点。树的根没有分配到任何地方;在您的函数createTree
中,您可能认为它已分配在:</ p>
if (curr == NULL)
curr = newnode;
但curr
是函数的本地函数,即使您将其作为参数root
,也不会影响curr
。您需要将参数curr
更改为指针指针,否则该函数不能用于分配根节点或子节点。也就是说,函数声明变为:
void createTree(struct Tree **curr, int val)
当然,您必须相应地更改函数内curr
的使用(即,指向的地址是*curr
,它曾经是curr
),函数的调用需要传递指针的地址而不是值(例如,createTree(&root, arr[i])
)。
编辑:或者,确实让函数返回curr
并始终将返回值分配给您调用createTree
的每个位置的相关指针,这要归功于@乔纳森莱弗勒的观察。
答案 1 :(得分:2)
学习使用调试器!
单步执行main函数,您会看到每次调用root
后NULL
的值都会保持createTree
createTree
函数不会修改root
的值,只会修改root
值的副本。
你的createTree
函数需要一个struct Tree **curr
,一个指向指针的指针。这允许函数修改原始值,而不是本地副本。