C 树下元素插入有什么问题
收益率:2,5C 树下元素插入有什么问题,c,insert,tree,C,Insert,Tree,收益率:2,5 你在太多的地方赋值 void PrintPreOrder(node *node) { if(node==NULL) { return; } else { printf("%d ", node->data); PrintPreOrder(node->left); PrintPreOrder(node->right); } } 这些行返回值,并在递
你在太多的地方赋值
void PrintPreOrder(node *node)
{
if(node==NULL)
{
return;
}
else
{
printf("%d ", node->data);
PrintPreOrder(node->left);
PrintPreOrder(node->right);
}
}
这些行返回值,并在递归堆栈的每个级别赋值
递归时不应重复赋值。否则,您将通过使用最终结果节点替换遍历中的每个节点来拆下正在遍历的树
对于这样结构的代码(使用左/右递归+返回),您应该在以下位置执行赋值:
return node->left = insert(node->left, data);
// ...
return node->right = insert(node->right, data);
但是,如果执行此操作,则必须将指针指向指针。问题在于,在您的情况下,
insert
函数应始终返回当前节点。大概是这样的:
if(node == NULL)
{
// assign here...
}
struct node*insert(struct node*node,int数据)
{
if(node==NULL)
{
//如果树是空的
返回NewNode(数据);
}
其他的
{
如果(节点->数据>数据)
{
//数据少于节点,添加到左子树
节点->左=插入(节点->左,数据);
//
return node->left = insert(node->left, data);
// ...
return node->right = insert(node->right, data);
if(node == NULL)
{
// assign here...
}
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;
}
}