【问题标题】:what is wrong with below tree element insert下面的树元素插入有什么问题
【发布时间】:2011-07-13 07:08:21
【问题描述】:
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);
    }
} 

【问题讨论】:

    标签: c insert tree


    【解决方案1】:

    问题是您的情况下的 insert 函数应该始终返回 current 节点。像这样的:

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

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

    【讨论】:

      【解决方案2】:

      您在太多地方赋值。

      return node->left = insert(node->left, data);
      // ...
      return node->right = insert(node->right, data);
      

      这些行返回值,并在递归堆栈的每一级分配 -。

      您不应该在递归时重复分配。否则,您将通过将遍历中的每个节点替换为最终结果节点来拆除您正在遍历的树。

      使用这样的代码结构(使用左/右递归 + 返回),您应该进行赋值的唯一位置是:

      if(node == NULL)
      {
          // assign here...
      }
      

      但是,如果你这样做,你将不得不使用一个指针到指针。

      【讨论】:

        猜你喜欢
        • 2019-04-26
        • 2021-12-05
        • 1970-01-01
        • 2013-05-02
        • 2013-06-06
        • 1970-01-01
        • 1970-01-01
        • 2018-06-27
        相关资源
        最近更新 更多