迭代地插入二叉搜索树.Debug C ++代码

时间:2012-02-20 19:24:12

标签: c++ binary-tree

这是一个c ++函数,用于从整数数组创建BST树? 这很简单。
取第一个元素,制作根。
取下一个数组元素并将其插入树中 为什么循环从i = 2开始而不是i = 1 ??

node* buildtree(int a[], int len)
{
    node* root=new node(a[0]);
    node* temp=root;
    for(int i=1;i<len;i++)
    {
        while(!(root->left==NULL && root->right==NULL))
        {
            cout<<"here"<<i<<" "<<a[i]<<"  " << root->val<<"\n";
            if(root->val>a[i])
                root=root->left;
            else
                root=root->right;
        }
        node* currnode=new node(a[i]);
        if(root->val>a[i]) 
            root->left=currnode;
        else
            root->right=currnode;  

        if(root==NULL)
            cout<<"error...never.here";
        root=temp;
    }
    return root;
}

非常感谢你解释它。我尝试了另一种方式,但它只找到了根。它的问题是什么?

   node* buildtree(int a[],int len)
   { node*  root=new node(a[0]);
    node* curr;
    for(int i=1;i<len;i++)
     { curr=root;
       while(curr!=NULL)    
         {
         if(curr->val>a[i])
         curr=curr->left;
         else 
         curr=curr->right;
         }
     curr=new node(a[i]); 
     }  
 return root;             
  }

2 个答案:

答案 0 :(得分:1)

因为在循环的第一次迭代中while条件不成立,因为根节点没有子节点。

while(!(root->left==NULL && root->right==NULL)

对于i = 1,左侧和右侧节点为NULL,并且在第一次迭代结束时填充左侧节点。

答案 1 :(得分:0)

当试图找到插入点时,

while(!(root->left==NULL && root->right==NULL))
{
    cout<<"here"<<i<<" "<<a[i]<<"  " << root->val<<"\n";
    if(root->val>a[i])
        root=root->left;
    else
        root=root->right;
}

只有当两个孩子都是NULL时才会停止,因此在某些时候,您会将root设置为NULL。考虑数组以[5, 3, 6, ... ]开头。你从

开始
NULL <- node(5) -> NULL
node(3) <- node(5) ->NULL

然后尝试插入3.因为不是两个孩子都是NULL,所以while循环运行

if (5 > 7)  // false
    root = root->left;
else
    root = root->right;  // now root == NULL, oops

并重新检查控制条件

while(!(NULL->left == NULL && NULL->right == NULL))

可能在这里发生了段错误,调用了未定义的行为。

您应该执行类似

的操作
while(true) {
    if (root->val > a[i]) {
        if (root->left == NULL) {
            root->left = new node(a[i]);
            break;
        } else {
            root = root->left;
        }
    } else {
        if (root->right == NULL) {
            root->right = new node(a[i]);
            break;
        } else {
            root = root->right;
        }
    }
}