将节点插入二叉树时,原始节点会更改

时间:2014-05-29 23:50:25

标签: c insert binary-tree

我正在尝试使用递归插入函数创建二叉树,但我的根节点似乎在不断变化(如果没有,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);  


}

1 个答案:

答案 0 :(得分:0)

好的,所以现在我们一起想出来了。您的insert()被声明为

Tnode *insert(...)

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

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

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