我的问题是:我想编写一个从用户获取数字的代码,将其放在二叉树上,当用户输入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
答案 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