在将节点插入二叉树时,我在哪里做错了?

时间:2014-04-05 20:21:51

标签: c data-structures 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;
}

2 个答案:

答案 0 :(得分:1)

temp = new_item;并不能按照您的想法行事。它只是将本地变量temp重新分配给其他东西。它不会改变你复制它的指针。

Node视为一个人,并将该人的每一手(可以指向另一个人)分别作为leftright指针。现在你的树是一个指向对方的整个网络。然后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修改了它。