【问题标题】:Original node changes when inserting nodes into binary tree将节点插入二叉树时原始节点发生变化
【发布时间】:2014-05-30 08:28:22
【问题描述】:

我正在尝试使用递归插入函数创建二叉树,但我的根节点似乎一直在变化(如果没有,printf 应该始终在下面的代码中给出相同的输出)。关于如何解决这个问题的任何想法?

typedef struct Tnode{

    char name[30];
    int value;

    struct Tnode *left;
    struct Tnode *right;

} Tnode;


Tnode *insert(Tnode *node, char *name, int value){ 

    if(node==NULL){

        Tnode *temp = malloc(sizeof(struct Tnode));

        sprintf(temp->name,"%s",name);
        temp->value = value;

        temp->left = NULL;
        temp->right = NULL;

        return temp;

    }

    else if(strcmp(name,node->name)<0)
    {
        node->left = insert(node->left, name, value);   
    }

    else if(strcmp(name,node->name)>0)
    {
        node->right = insert(node->right, name, value);
    }   
    else{
        printf("something went wrong\n");
    }   

}


int main(){

    Tnode *root = NULL;

    root = insert(root,"george",11);
    root = insert(root,"dick",12);
    printf("%s\n",root->name);  
    root = insert(root,"walter",13);
    root = insert(root,"harry",13);
    printf("%s\n",root->name);  
    root = insert(root,"zink",40);
    printf("%s\n",root->name);  


}

【问题讨论】:

  • 请给我们看看输出
  • 你总是分配root = insert(...),但是在第一次插入之后,这个调用不会返回任何东西。您需要通过递归调用将返回值传递回 main() 的初始调用
  • 以上每一项都在换行符上
  • Pavel,你能提供一些语法吗?我不确定我明白你的意思
  • 只需在函数末尾添加return node;即可。

标签: c insert binary-tree


【解决方案1】:

好的,现在我们已经一起解决了。你的 insert() 被声明为

Tnode *insert(...)

所以它总是需要返回一个指向 Tnode 的指针,但是在你的 if 子句中有些情况会导致一个不返回任何内容的执行分支。我想它是未定义的返回值是什么。

由于 insert() 通过传递调用“如果你是一片叶子,把值放在这里并返回你自己”来递归操作,你需要处理这种情况“如果你不是,做... 然后返回 ...”。所以想象你已经有一棵大树并且你插入了一个值,根将调用向下传递到二进制结构,直到找到正确的位置。最终调用(递归结束的地方)将返回一个 *Tnode 到该叶子,以便之前的调用可以正确设置 node-&gt;left = insert(...);,但堆栈上仍然有“打开”调用(因为它是递归)需要获取关闭,即函数终止,每个节点都向node-&gt;leftnode-&gt;right 写入内容。如果您不返回任何内容,则可能有一些任意值会破坏您的数据结构并导致未定义的行为。

因此,解决方案只是在末尾添加一个return node;,以便通过保持根和新叶之间的“传递”节点保持不变来完成递归调用。

【讨论】:

  • 非常感谢 Pavel - 现在一切运行顺利。递归有点新,所以这很有帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-30
  • 2021-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多