下面的树元素插入有什么问题

时间:2011-07-13 07:08:21

标签: c insert tree

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);
    }
} 

2 个答案:

答案 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;
    }
}

运算符=返回在其右侧设置的值 - 在您的情况下,这是最底层创建的子节点,最终会覆盖其中一个顶级节点。