我已经编写了两个用于插入二叉树的不同代码,一个可以正常工作,而另一个则没有。
这是我的节点的外观:
struct node
{
int data;
node *left;
node *right;
};
以下是node* newnode(int a)
node* newnode(int a)
{
node *temp=new node;
temp->data=a;
temp->left=nullptr;
temp->right=nullptr;
return temp;
}
以下是两个不同的插入代码:
这个返回指向节点的指针:
node* insertion(node *root, int a)
{
if(root==nullptr)
return newnode(a);
else if(a<root->data)
root->left=insertion(root->left, a);
else
root->right=insertion(root->right, a);
}
这个返回void:
void insertion2(node *root,int a)
{
if(root==nullptr)
root=newnode(a);
else if(a<root->data)
insertion2(root->left,a);
else
insertion2(root->right,a);
}
返回void的那个不起作用。根据我的分析,在函数调用之后,root
仍然是nullptr
。任何人都可以解释我为什么不起作用?
答案 0 :(得分:2)
请注意,在insertion
版本中,您有root->left = insertion(root->left, a)
和root->right = insertion(root->right, a)
,但在insertion2
中没有任何相同的效果。实际上,insertion2
除泄漏内存外什么都不做。
答案 1 :(得分:1)
回答你的问题。
你的insert2函数的问题是root变量将在被调用的地方指向nullptr(NULL)并且分配一个新的内存并指向insert2()函数内的本地引用。对新内存位置的引用更改不会对引用@调用位置产生任何影响。正如其他人所指出的,这个调用总是会在@clearer answer中泄漏内存。
使此功能正常工作。移动对象创建部分@调用位置,只留下插入到此函数。
类似下面的内容应该有用。
void insertion2(node *root, node *new_node)
{
if(root==nullptr)
root=new_node;
else if(a<root->data)
insertion2(root->left,new_node);
else
insertion2(root->right,new_node);
}
// Create the new node and call the insert function
new_node = newnode(a);
insertion2(root, new_node);
希望它澄清你的疑问!
答案 2 :(得分:1)
始终是局部变量,因此更新它不会更改主root变量,因为指针本身未通过引用传递。您可以通过引用调用来实现,只需更改您的
函数标题如下:void insertion2(node *&root,int a)
。
答案 3 :(得分:0)
这种方法在使用void返回类型时工作正常。声明一个全局变量,首先..如果要插入的节点是第一个,则将其设置为一个。然后将其更改为0。
void insertRoot(struct node* newnode){
root=newnode;
}
void insert(struct node* root, int data)
{
if(first==1){
insertRoot(createNode(data));
first=0;
}else{
if (data < root->data){
if(root->left==NULL){
root->left=createNode(data);
}else{
insert(root->left,data);
}
}
else if (data > root->data){
if(root->right==NULL){
root->right=createNode(data);
}else{
insert(root->right,data);
}
}
}
}
答案 4 :(得分:0)
调用方法中的根指针也需要更新。因此,您必须使用类似的方法来调用Insert2方法: Insert2(&BSTNodePtr,a)。当您传递变量BSTNodePtr的地址时,Insert2方法可以更新其内容。
尝试以下方法:
void Insert2(BSTNode **root, int a){
if (*root==NULL){
*root = new BSTNode(a);
}
else if (a<= (*root)->data){
Insert2(&((*root)->left), a);
}
else{
Insert2(&((*root)->right), a);
}
}