这是一个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;
}
答案 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;
}
}
}