我是指针的新手,特别是指针的指针。所以我试图用指针尽可能多地弄清楚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;
}
编辑:程序现在正常运行。它只是缺少一个释放树中内存的函数。我将继续努力。