[英]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->left
或node->right
。 如果不返回任何內容,則可能會有一些任意值破壞數據結構並導致未定義的行為。
因此,解決方案就是添加一個return node;
最后,以便可以通過保留根與新葉之間的“傳遞”節點不變來完成遞歸調用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.