gpt4 book ai didi

C++:指针与指针的指针在二叉树中插入节点

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:43:45 24 4
gpt4 key购买 nike

我正在创建一个函数来在二叉树中插入一个元素,首先,我在 Visual Studio 2012 上执行了以下操作:

void Insert(Nodo *root, int x){
if(root == NULL){
Nodo *n = new Nodo();
n->value = x
root = n;
return;
}
else{
if(root->value > x)
Insert(&(root)->left, x);
else
Insert(&(root)->right, x);
}
}

但同样的代码在 Dev-C++ 中不起作用,我需要使用 Pointer of Pointer 使其工作,如下所示:

void Insert(Nodo **root, int x){
if(*root == NULL){
Nodo *n = new Nodo();
n->value = x
*root = n;
return;
}
else{
if((*root)->value > x)
Insert(&(*root)->left, x);
else
Insert(&(*root)->right, x);
}
}

有人知道为什么会这样吗?

最佳答案

第一个代码不应该编译。事实上,它不能在 MSVC 2013 下编译。

为什么?

你的节点结构应该是这样的:

struct Nodo {
int value;
Nodo*left, *right; // pointer to the children nodes
};

这意味着 (root)->leftNodo* 类型。因此 &(root)->left 属于 Nodo** 类型,它与 Nodo* 参数不兼容。

无论如何,在您的插入函数中,您肯定想要更改树。但是,如果您执行以下操作:root = n;,您只需更新 root 参数(指针)。一旦您离开该功能,此更新就会丢失。在这里,您当然想要更改根节点的内容或者更可能是指向根节点的指针。

在第二个版本中,您将指向节点的指针地址作为参数传递,然后在必要时更新该指针(预期行为)。

备注

第一个版本可以“保存”,如果你想通过引用传递:

void Insert(Nodo * &root, int x){  // root then refers to the original pointer 
if(root == NULL){ // if the original poitner is null...
Nodo *n = new Nodo();
n->value = x
root = n; // the orginal pointer would be changed via the reference
return;
}
else{
if(root->value > x)
Insert(root->left, x); // argument is the pointer that could be updated
else
Insert(root->right, x);
}
}

关于C++:指针与指针的指针在二叉树中插入节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30114179/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com