二叉树 - C代码

时间:2018-03-18 21:35:56

标签: tree

我的问题是:我想编写一个从用户获取数字的代码,将其放在二叉树上,当用户输入0时,按顺序打印树。但是,当我得到,例如,5 4 6 0,正确的结果将是4 5 6,但我没有输出......任何人都可以帮助我吗?

#include <stdio.h>
#include <stdlib.h>

typedef struct TreeNode TreeNode;
struct TreeNode{
    int data;
    TreeNode* left;
    TreeNode* right;
};

TreeNode* newTree(){
    return NULL;
}

void insertNode(TreeNode* node, int value){
    if(node==NULL){
        TreeNode* tmp = malloc(sizeof(TreeNode));
        tmp->data=value;
        tmp->left=NULL;
        tmp->right=NULL;
    }

    else{
        if(value > node->data){
            insertNode(node->right, value);
        }
        if(value < node->data){
            insertNode(node->left, value);
        }
    }
}

void inOrder(TreeNode* t){
    if(t==NULL){
        return;
    }
    else{
        inOrder(t->left);
        printf("%d\n", t->data);
        inOrder(t->right);
    }
}

int main(){
    TreeNode* root = malloc(sizeof(TreeNode));
    TreeNode* aux;
    aux = newTree();
    root = newTree();
    int number, cont=0;

    while(1){
        printf("Type the number you want to add (0 to exit): ");
        scanf("%d", &number);
        if(number==0){
            printf("In order: \n");
            inOrder(root); 
            return 0;
        }
        else{
            insertNode(root, number);
        }
        cont++;
    }

}//end of main

1 个答案:

答案 0 :(得分:0)

在插入节点功能中,当您从参数接收的节点为NULL时,您创建一个新的tmp节点,但是您从未将作为参数TreeNode* node发送的指针分配给你创建的新节点。

另一个问题是在insertNode函数之外的根节点中执行malloc,因为这将创建一个非空节点,而没有data值。然后它会在你的函数中输入else而没有任何值进行比较,或者更糟的是垃圾。通过删除它,只要插入第一个值就会分配根节点,而不会出现任何问题。

最后,您的insertNode应该通过引用传递节点,以便在执行malloc时保留它将被分配的新值,这将使插入函数看起来像这样:

编辑:实现了问C的问题,而不是C ++,纠正了代码

void insertNode(TreeNode** node, int value){
    if(*node==NULL){
        TreeNode* tmp = malloc(sizeof(TreeNode));
        tmp->data=value;
        tmp->left=NULL;
        tmp->right=NULL;
        *node = tmp;
    }

    else{
        if(value > (*node)->data){
            insertNode(&(*node)->right, value);
        }
        if(value < (*node)->data){
            insertNode(&(*node)->left, value);
        }
    }
}

从主函数中删除malloc:

int main(){
    TreeNode* root = NULL;// = malloc(sizeof(TreeNode));
    TreeNode* aux;
    aux = newTree();
    root = newTree();
    int number, cont=0;

    while(1){
        printf("Type the number you want to add (0 to exit): ");
        scanf("%d", &number);
        if(number==0){
            printf("In order: \n");
            inOrder(root); 
            return 0;
        }
        else{
            insertNode(&root, number);
        }
        cont++;
    }

}//end of main