[英]Where am I doing wrong for inserting node to a binary tree?
我在stackoverflow中進行研究,無法找出我在哪里做錯了。 我發現的代碼與我的類似。 我在編碼AddNodeToTree函數時遇到困難。 當我運行此代碼時,其輸出始終是樹的第一項。 我想迭代編碼。 你能幫我我在想什么嗎? 謝謝。
這是我的代碼。
#include <stdio.h>
#include <stdlib.h>
typedef struct _Node{
int data;
struct _Node* left;
struct _Node* right;
}Node;
void* AllocateMemory(size_t size){
void* pvMem;
pvMem=malloc(size);
if(pvMem==NULL){
fprintf(stderr,"Cannot Allocate Memory!");
exit(EXIT_FAILURE);
}
return pvMem;
}
Node* NewNode(int data){
Node* new_node;
new_node = AllocateMemory(sizeof(Node));
new_node->data = data;
new_node->left = NULL;
new_node->right = NULL;
return new_node;
}
Node* AddNodeToTreeRecursive(Node* root, int data){
if(NULL==root)
return (NewNode(data));
if(root->data > data)
root->left = AddNodeToTreeRecursive(root->left, data);
else if(root->data < data)
root->right = AddNodeToTreeRecursive(root->right, data);
return root;
}
void PrintList(Node* root){
if(root==NULL)
return;
printf("DATA: %d\n", root->data);
PrintList(root->left);
PrintList(root->right);
}
Node* AddNodeToTree(Node* root, int data){
Node* new_item = NewNode(data);
Node** temp = &root;
if(root==NULL)
return new_item;
while(*temp!=NULL){
if((*temp)->data > data)
temp = &(*temp)->left;
else if((*temp)->data <= data)
temp = &(*temp)->right;
}
*temp = new_item;
return root;
}
int main()
{
Node* root=NULL;
root=AddNodeToTree(root, 30);
root=AddNodeToTree(root, 20);
root=AddNodeToTree(root, 10);
root=AddNodeToTree(root, 1);
root=AddNodeToTree(root, 5);
root=AddNodeToTree(root, 3);
root=AddNodeToTree(root, 7);
PrintList(root);
return 0;
}
temp = new_item;
不按照您的想法去做。 它所做的就是將局部變量temp
重新分配給其他變量。 它不會更改您從中復制指針。
將Node
視為一個人,該人的每只手(可以指向另一個人)分別是left
指針和right
指針。 現在,您的樹是一個相互指向的人的整個網絡。 然后temp
是別人的手,反復指向不同的人,直到他/她最終什么都沒有指向。 然后,您告訴他/她指向其他人( new_item
),這顯然不會改變您彼此指向的人脈網絡,因為temp
不在此網絡中。
我能想到的最簡單的解決方法是使temp
成為Node**
:
Node** temp = &root;
// your code to traverse the tree, except that you should
// replace `temp = ...` with `temp = &...`
// and every other occurrence of `temp` with `*temp`
*temp = new_item;
為了擴展這個比喻, temp
將指向一個手而不是一個人,而更改*temp
將使該手指向另一個人。 由於那只手是網絡的一部分,因此更改它會改變網絡。
這在AddNodeToTree中看起來很腥
while(temp!=NULL){
if(temp->data > data)
temp = temp->left;
else if(temp->data <= data)
temp = temp->right;
}
原因是:臨時根。 您將其作為指針傳遞。
您將其設置為左或右節點。
您將返回root,但是您通過修改temp對其進行了修改。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.