簡體   English   中英

將節點插入二叉樹時,原始節點會發生變化

[英]Original node changes when inserting nodes into 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);  


}

好的,所以現在我們一起解決了。 您的insert()被聲明為

Tnode *insert(...)

因此它總是需要返回一個指向Tnode的指針,但是在if子句中有一些情況導致執行分支什么都不返回。 我想這是不確定的返回值。

由於insert()通過傳遞調用“如果您是葉子,將值放在此處並返回自己”來遞歸操作,因此您需要處理以下情況:“如果不是,則執行... 然后返回... ”。 因此,假設您已經有一棵大樹並插入一個值,則根將調用沿二進制結構向下傳遞,直到找到正確的位置為止。 最后一個調用(遞歸結束處)將向該葉子返回一個* Tnode,以便上一個調用可以正確設置node->left = insert(...); ,但是仍然需要關閉堆棧上的“ open”調用(因為它是遞歸),即函數終止,每個節點都將一些內容寫入node->leftnode->right 如果不返回任何內容,則可能會有一些任意值破壞數據結構並導致未定義的行為。

因此,解決方案就是添加一個return node; 最后,以便可以通過保留根與新葉之間的“傳遞”節點不變來完成遞歸調用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM