struct node* insert(struct node* node, int data)
{
if(node == NULL)
{
// if tree is empty
return NewNode( data );
}
else
{
if( node->data > data )
{
// data is less than node, add to left subtree
return node->left = insert(node->left, data);
}
else if( node->data <= data)
{
// data is more than node, add to right subtree
return node->right = insert(node->right, data);
}
// else return node
return node;
}
}
用
调用node *p = new node();
p->data = 2;
//printf("%d",lookup(p,2));
insert( p, 3);
insert( p, 4);
insert( p, 5);
PrintPreOrder(p);
返回:2,5
void PrintPreOrder(node *node)
{
if(node==NULL)
{
return;
}
else
{
printf("%d ", node->data);
PrintPreOrder(node->left);
PrintPreOrder(node->right);
}
}
答案 0 :(得分:0)
您在太多地方分配值。
return node->left = insert(node->left, data);
// ...
return node->right = insert(node->right, data);
这些行返回值,并在递归堆栈的每个级别分配。
递归时不应重复分配。否则,您将通过用最终结果节点替换遍历中的每个节点来拆除您正在遍历的树。
使用这样的代码结构(使用左/右递归+返回),您应该进行分配的唯一位置是:
if(node == NULL)
{
// assign here...
}
但是,如果你这样做,你将不得不采用指向指针的方式。
答案 1 :(得分:0)
问题是你的insert
函数应该总是返回当前节点。像这样:
struct node* insert(struct node* node, int data)
{
if(node == NULL)
{
// if tree is empty
return NewNode( data );
}
else
{
if( node->data > data )
{
// data is less than node, add to left subtree
node->left = insert(node->left, data);
// <<<<<<<<<<< NO RETURN HERE
}
else if( node->data <= data)
{
// data is more than node, add to right subtree
node->right = insert(node->right, data);
// <<<<<<<<<<< NO RETURN HERE
}
// else return node
//ALWAYS RETURN NODE
return node;
}
}
运算符=
返回在其右侧设置的值 - 在您的情况下,这是最底层创建的子节点,最终会覆盖其中一个顶级节点。