Can';我不明白为什么我的BST是';没有正确建造

Can';我不明白为什么我的BST是';没有正确建造,c,pointers,binary-search-tree,C,Pointers,Binary Search Tree,我对指针很陌生,尤其是指针。所以我试图尽可能多地了解BST使用指针的情况。我一直在做研究,但我发现大多数实现BST的方法都没有通过为每个节点的数据值传入一个整数数组来构建树的功能 我试图使用build_tree函数在构建树时遍历数组 有时,输入的任何数量的数字超过5个或更多时,打印出来的数字总数仅为5个 因此,如果我输入1,2,3,4,5,6,7,那么结果是 预订单:1,2,3,4,5 邮购:5,4,3,2,1 它会在5个数字上删除额外的数字 有时结果是非常不可预测的。内存位置有时也会打印出来。

我对指针很陌生,尤其是指针。所以我试图尽可能多地了解BST使用指针的情况。我一直在做研究,但我发现大多数实现BST的方法都没有通过为每个节点的数据值传入一个整数数组来构建树的功能

我试图使用build_tree函数在构建树时遍历数组

有时,输入的任何数量的数字超过5个或更多时,打印出来的数字总数仅为5个

因此,如果我输入
1,2,3,4,5,6,7
,那么结果是

预订单:
1,2,3,4,5

邮购:
5,4,3,2,1

它会在5个数字上删除额外的数字

有时结果是非常不可预测的。内存位置有时也会打印出来。我知道我还没有释放任何内存,但一旦我解决了这个问题,我会继续努力

我感谢您的反馈

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

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

void build_tree(TreeNode **root, const int elements[], const int count) {

    int i;
    for(i = 0; i < count; i++){
        TreeNode *temp = *root;
        TreeNode *prev = *root;

        if(*root == NULL) {
            *root = (TreeNode*)malloc(sizeof(TreeNode));
            (*root)->data = elements[i];

            (*root)->left = (*root)->right = NULL;
        }
        else {
            while(temp != NULL) {
                if(elements[i] > temp->data) {
                    prev = temp;
                    temp = temp->right;
                }
                else {
                    prev = temp;
                    temp = temp->left;
                }
            }
            temp = (TreeNode*)malloc(sizeof(TreeNode));
            temp->left = temp->right = NULL;
            temp -> data = elements[i];
            if(elements[i] >= prev -> data)
                prev->right = temp;
            else
                prev->left = temp;
        }
    }
}

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

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

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

int main(int argc, char **argv) {
    int intNum = atoi(argv[1]);
    assert(argc == 2 && "Usage: bst#\n");
    assert(intNum > 0 && "must be greater than 0\n");
    fprintf(stdout, "Enter %i integer values to place in tree:\n", intNum);

    int input[intNum];
    int i;
    for(i = 0 ; i < intNum ; i++) {
        scanf("%i", &input[i]);
        }
    TreeNode *root = NULL;
    build_tree(&root, input, intNum);

    printf("Preorder: \n");
    preorder(root);
    printf("\n");

    printf("Postorder: \n");
    postorder(root);
    printf("\n");

    printf("Inorder: \n");
    inorder(root);
    printf("\n");
    return 0;
}
#包括
#包括
#包括
#包括
类型定义结构树节点{
int数据;
结构树节点*左;
结构树节点*右侧;
}三烯醇;
无效生成树(树节点**根,常量int元素[],常量int计数){
int i;
对于(i=0;i数据=元素[i];
(*root)->left=(*root)->right=NULL;
}
否则{
while(temp!=NULL){
if(元素[i]>temp->data){
prev=温度;
温度=温度->右侧;
}
否则{
prev=温度;
温度=温度->左侧;
}
}
temp=(TreeNode*)malloc(sizeof(TreeNode));
临时->左=临时->右=空;
温度->数据=元素[i];
if(元素[i]>=prev->data)
上->右=温度;
其他的
上一个->左=温度;
}
}
}
无效预订单(TreeNode*temp){
if(temp==NULL){
返回;
}
printf(“%d\n”,临时->数据);
预订单(临时->左);
预订单(临时->右侧);
}
无效邮购(TreeNode*temp){
if(temp==NULL)
返回;
后订单(临时->左);
后期订单(临时->右侧);
printf(“%d\n”,临时->数据);
}
无效顺序(树节点*临时){
if(temp==NULL)
返回;
顺序(临时->左);
printf(“%d\n”,临时->数据);
顺序(临时->右侧);
}
int main(int argc,字符**argv){
int intNum=atoi(argv[1]);
断言(argc==2&&“用法:bst#\n”);
断言(intNum>0&“必须大于0\n”);
fprintf(stdout,“输入%i整数值以放置在树中:\n”,intNum);
int输入[intNum];
int i;
对于(i=0;i

编辑:程序现在工作正常。它只是缺少一个释放树中内存的函数。我将处理这个问题。

int-input[argc-1]应该是
int输入[intNum]是否进行了以下更改<代码>整数输入[argc-1]-->
int输入[intNum]
构建树(&root,input,sizeof(input))-->
构建树(&root,input,intNum)
int输入[输入]<代码>sizeof(intNum)
<代码>(*根)->数据=元素[i];i++
i++
??┐('~`;)┌
i++
不需要。为什么要使用
sizeof(input)
sizeof(intNum)
)而不是
intNum