为什么插入BST的代码不起作用?

时间:2016-04-17 19:50:54

标签: c data-structures binary-search-tree

我正在编码插入C中的BST。当我遍历树时,第一个片段似乎无效。我不明白为什么它不起作用。 这不起作用:

    void insert(Node* temp, int data)
{
    if(temp==NULL)
    temp=Newnode(data);
    else if(data<temp->data)
         insert(temp->left,data);
    else if(data>temp->data)
         insert(temp->right,data);

}

这有效:

Node* insert(Node* temp, int data)
{
    if(data<temp->data)
      if(temp->left!=NULL) insert(temp->left,data);
      else temp->left= Newnode(data);
    else if(data>temp->data)
       if(temp->right!=NULL) insert(temp->right,data);
       else temp->right= Newnode(data);
}

注意:我使用了#define Node struct node。 Newnode()分配一个新节点并且工作正常。

2 个答案:

答案 0 :(得分:0)

看看以NULL作为根值传递时会发生什么:

temp正在分配一个新的节点实例。但是,赋值仅在insert()本地,因此在调用返回后,赋值已“消失”。

您可能希望将插入方法签名更改为
       void insert(Node **temp, data)
并使用 *temp = Newnode(data);
使它像你期望的那样工作。

答案 1 :(得分:0)

严格来说,第二种方式也不正确。对于您发布的两种方式:

  1. 递归结束条件有问题。当temp为NULL时,代码会创建一个新节点。但是,新创建的节点无法在BST中附加到父节点。
  2. 函数返回类型是Node *,但没有显式代码执行返回。虽然默认情况下C会将Newnode的返回值作为Insert的返回值,但它不正确。
  3. 以下是两个版本:

    def cached_coroutine(f):
        @gen.coroutine
        def wrapped(*args):
            if args in cache:
                return cache[args]
            result = yield f(*args)
            cache[args] = f
            return result
        return wrapped
    

    这个通过双指针来解决上述问题。

    void insert(node **curr, int val) {
        if(!(*curr)) {
            *curr = Newnode(val);
            return;
        }
    
        if(val < (*curr)->data) {
            insert(&(*curr)->left, val);
        } else if(val > (*curr)->data) {
            insert(&(*curr)->right, val);
        }
    }
    
    insert(&root, val);
    

    这个使用return val赋值作为解决方案。