【问题标题】:Confused with the usage of double pointers insertion of nodes in a Binary Tree对在二叉树中使用双指针插入节点感到困惑
【发布时间】:2018-03-18 11:41:37
【问题描述】:

所以这里是可以正常工作的函数:

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);
    }
}

另外,在第一个函数中,我无法理解&amp;(*root) 的用法。这不是没有意义,因为*root 本身就是一个指针。因此,“指针的地址”是多余的,因为指针已经存储了地址值。我可能有点困惑,所以非常感谢您的帮助。
谢谢!

【问题讨论】:

    标签: c pointers binary-tree double-pointer


    【解决方案1】:

    C 按值传递参数,如果您使用第二种方法:

    void Insert(node * root, int inpdata);
    

    调用该函数后,调用方的root不受影响。

    我无法理解 &(*root) 的用法

    你被precedence弄糊涂了,错误地解析了表达式。 &amp;(*root)-&gt;left

    &((*root)->left).
    

    【讨论】:

    • 我不明白为什么我做root = createNode(inpdata);时调用方的root不会受到影响?
    • 它不会将根指针分配为保存数据的新指针吗?
    • @Huzo 因为函数体中的root指针是本地副本。想想你传Insert(NULL, 11),调用后怎么改NULL
    • 啊,我现在明白了。这完全是关于第二个函数只是修改本地副本而不是真正的指针本身!谢谢。现在明白了。
    【解决方案2】:

    首先,感谢您提出这个问题。因为我也在执行 BT(BINARY TREE)。你的问题的答案在于程序的全部部分。

    如果你在外部声明根/头指针,那么你不需要使用双指针。但是 iIf 你在主函数中声明根指针。然后我们想出了两种可能性:

    如你所知,我们在 main 内部的起点将 root 声明为 NULL

    1. 当您调用插入方法并将参数作为根和数据时,您将在插入函数中收集作为本地根指针变量。即使您更改了根local 的链接,这不会对(主)根产生任何影响,所以这就是您必须在插入函数中声明双指针的原因。然后,如果您使用 root 进行一些计算,那么它将用于(真实)main,如果您使用的是双指针,那么通过递归,您将向双指针发送地址,因此您必须发送指针的地址,尽管它会影响您调用的实际指针
    2. 下一种方法是,您可以在每次调用 insert 方法时返回根的地址,并将其收集到根中,然后像在插入方法中的递归双向链表中一样计算一切正常

    EG:. root=insert(root,data);

    【讨论】:

    • 请花点时间校对您的答案并以清晰易读的方式格式化。这堵文字墙无法阅读。
    猜你喜欢
    • 2019-12-13
    • 2015-07-18
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多