想在二叉树中插入元素。这段代码有什么问题。我有一个带有数据的结构,左边和右边是自引用结构,root是一个初始化为NULL的类型结构的全局变量。
void insert(struct tree_node *root,int data)
{
if(root == NULL)
{
tree_node *new_node = new tree_node();
new_node->left = NULL;
new_node->right = NULL;
}
else if(root->data > data)
{
insert(root->left,data);
}
else
{
insert(root->right,data);
}
}
答案 0 :(得分:2)
您建议的代码有几个问题:
您应该尝试这样做:
struct tree_node *insert(struct tree_node *root, int data)
{
if(root == NULL) {
struct tree_node *new_node = new tree_node();
new_node->data = data;
new_node->left = NULL;
new_node->right = NULL;
return new_node;
} else if(root->data > data) {
root->left = insert(root->left, data);
} else {
root->right = insert(root->right, data);
}
return root;
}
你可以用
打电话root = insert(root, data);
答案 1 :(得分:2)
**您已经创建了new_node但没有为其赋值。所以您无法为其插入值。
void insert_nrec(int m) //for insert in binary tree
{
node *tmp,*par,*ptr;
ptr=root;
par=NULL;
tmp=NULL;
while(ptr!=NULL)
{
par=ptr;
if(m<ptr->data)
{ ptr=ptr->lchild; }
else if(m>ptr->data)
{ ptr=ptr->rchild; }
else
{
cout<<"duplicate key found::";
return;
}
}
tmp=new node;
tmp->data=m;
tmp->lchild=NULL;
tmp->rchild=NULL;
if(par==NULL)
{
root=tmp;
}
else if(m<par->data)
{
par->lchild=tmp;
}
else
{
par->rchild=tmp;
}
}
答案 2 :(得分:1)
什么时候将root设置为NULL
以外的任何其他内容?
一旦你这样做,你如何实际改变root->left
或right
?
答案 3 :(得分:0)
我只是要重写@TheRealNeo的漂亮'功能'答案,以便你传递一个对根指针的引用:
void insert(struct tree_node * &root, int data)
{
if(root == NULL) {
struct tree_node *new_node = new tree_node();
new_node->data = data;
new_node->left = NULL;
new_node->right = NULL;
root = new_node;
} else if(root->data > data) {
insert( root->left, data);
} else {
insert( root->right, data);
}
}
你用
打电话 insert(root, data);
这相对于功能性的一个优点是,编译器很可能实际上将递归调用作为“尾递归”,即当插入左,而不是进行递归调用时,代码将简单地改变' root'引用引用'root-&gt; left'并跳回到函数的开头。
显式非递归形式不是很清楚,因为它涉及一些指向指针的东西,但它真的不是那么糟糕:
void insert(struct tree_node * &root, int data)
{
struct tree_node **ptrp = &root;
while(*ptrp != NULL ){
struct tree_node *np = *ptrp;
if( np->data > data ){
ptrp = &np->left;
}else{
ptrp = &np->right;
}
}
// new node will be placed at *ptrp, a location
// currently containing NULL.
struct tree_node *new_node = new tree_node();
new_node->data = data;
new_node->left = NULL;
new_node->right = NULL;
*ptrp = new_node;
}