对二叉树中节点的双指针插入的用法感到困惑
Confused with the usage of double pointers insertion of nodes in a Binary Tree
下面是运行良好的函数:
void Insert(node ** root, int inpdata){//tree's root should be passed here
if(*root == NULL){
*root = createNode(inpdata);
}
else if(inpdata < (*root)->data){
Insert(&(*root)->left,inpdata);
}
else{
Insert(&(*root)->right,inpdata);
}
}
但我不明白为什么我们必须使用双指针。例如,为什么以下代码不起作用:
void Insert(node * root, int inpdata){//tree's root should be passed here
if(root == NULL){
root = createNode(inpdata);
}
else if(inpdata < root->data){
Insert(root->left,inpdata);
}
else{
Insert(root->right,inpdata);
}
}
另外,在第一个函数中,我无法理解&(*root)
的用法。那岂不是没有意义,因为*root
本身就是一个指针。因此,"address of a pointer" 是多余的,因为指针已经存储了一个地址值。我可能有点困惑,所以非常感谢您的帮助。
谢谢!
C 按值传递参数,如果你使用第二种方法:
void Insert(node * root, int inpdata);
调用此函数后,调用方root
不受影响
I could not comprehend the usage of &(*root)
您被precedence搞糊涂了,错误地解析了表达式。 &(*root)->left
是
&((*root)->left).
首先感谢您提出这个问题。因为我也在做 BT(BINARY TREE ) 的实现。你的问题的答案在于程序的全部部分。
如果你在外部声明根/头指针那么你不需要使用双指针。但是如果你在主函数中声明了根指针。那么我们得出2种可能:
如你所知,我们在 main
中的起始点将 root 声明为 NULL
- 当您调用插入方法并将参数作为根和数据放置时,您将在插入函数中收集作为本地根指针变量。即使您更改根
local
的链接也不会对(主)根产生任何影响,所以这就是您必须在插入函数中声明双指针的原因。然后,如果您使用 root 进行一些计算,那么它将用于(真实的)main,如果您使用双指针,那么通过递归,您将向双指针发送一个地址,因此您必须发送一个指针的地址,尽管它会影响你调用的实际指针
- 下一个方法是你可以 return 每次调用插入方法时的根地址,并将它收集在根中,并像插入方法中的递归双向链表一样正常计算所有内容
EG:. root=insert(root,data);
下面是运行良好的函数:
void Insert(node ** root, int inpdata){//tree's root should be passed here
if(*root == NULL){
*root = createNode(inpdata);
}
else if(inpdata < (*root)->data){
Insert(&(*root)->left,inpdata);
}
else{
Insert(&(*root)->right,inpdata);
}
}
但我不明白为什么我们必须使用双指针。例如,为什么以下代码不起作用:
void Insert(node * root, int inpdata){//tree's root should be passed here
if(root == NULL){
root = createNode(inpdata);
}
else if(inpdata < root->data){
Insert(root->left,inpdata);
}
else{
Insert(root->right,inpdata);
}
}
另外,在第一个函数中,我无法理解&(*root)
的用法。那岂不是没有意义,因为*root
本身就是一个指针。因此,"address of a pointer" 是多余的,因为指针已经存储了一个地址值。我可能有点困惑,所以非常感谢您的帮助。
谢谢!
C 按值传递参数,如果你使用第二种方法:
void Insert(node * root, int inpdata);
调用此函数后,调用方root
不受影响
I could not comprehend the usage of &(*root)
您被precedence搞糊涂了,错误地解析了表达式。 &(*root)->left
是
&((*root)->left).
首先感谢您提出这个问题。因为我也在做 BT(BINARY TREE ) 的实现。你的问题的答案在于程序的全部部分。
如果你在外部声明根/头指针那么你不需要使用双指针。但是如果你在主函数中声明了根指针。那么我们得出2种可能:
如你所知,我们在 main
中的起始点将 root 声明为 NULL- 当您调用插入方法并将参数作为根和数据放置时,您将在插入函数中收集作为本地根指针变量。即使您更改根
local
的链接也不会对(主)根产生任何影响,所以这就是您必须在插入函数中声明双指针的原因。然后,如果您使用 root 进行一些计算,那么它将用于(真实的)main,如果您使用双指针,那么通过递归,您将向双指针发送一个地址,因此您必须发送一个指针的地址,尽管它会影响你调用的实际指针 - 下一个方法是你可以 return 每次调用插入方法时的根地址,并将它收集在根中,并像插入方法中的递归双向链表一样正常计算所有内容
EG:. root=insert(root,data);