我在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;
}
答案 0 :(得分:1)
temp = new_item;
并不能按照您的想法行事。它只是将本地变量temp
重新分配给其他东西。它不会改变你复制它的指针。
将Node
视为一个人,并将该人的每一手(可以指向另一个人)分别作为left
和right
指针。现在你的树是一个指向对方的整个网络。然后temp
是其他人&#39;手,反复指向不同的人,直到他/她最终指向什么。然后你告诉他/她指向其他人(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
将涉及使该指针指向另一个人。由于该手是网络的一部分,因此更改它将改变网络。
答案 1 :(得分:0)
这在AddNodeToTree
中看起来很可疑while(temp!=NULL){
if(temp->data > data)
temp = temp->left;
else if(temp->data <= data)
temp = temp->right;
}
原因是:临时根。你把它作为指针传递过来。
您将其设置为左侧或右侧节点。
您正在返回root,但是您通过修改temp修改了它。