簡體   English   中英

將節點插入二叉樹時,我在哪里做錯了?

[英]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.

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