我是一名计算机工程专业的学生,我必须写BST作为一项任务,但代码并不像每个人都写的那样(据我搜索一些例子,所以我现在很绝望)这是我的代码所以远(我的课堂使用C作为主要语言而不是C ++)
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
typedef struct bst_node
{
int data;
struct bst_node *right;
struct bst_node *left;
}BST_NODE;
typedef struct bst
{
int size;
BST_NODE *root;
}BST;
void print(BST_NODE *pos)
{
printf("%d(0)",pos->data);
if(pos->left != NULL)
{
printf("%d(L)\n",pos->left->data);
pos=pos->left;
}
if(pos->right != NULL)
{
printf("%d(R)\n",pos->right->data);
pos=pos->right;
}
if(pos->left != NULL)
print(pos->left);
if(pos->right != NULL)
print(pos->right);
}
int main()
{
int number;
BST b;
BST_NODE *pos;
b.root=NULL;
while(1)
{
scanf("%d",&number);
printf("value=%d",number);
if(number<=0)
break;
if(b.root==NULL)
{
b.root=(BST_NODE*)malloc(sizeof(BST_NODE));
pos=b.root;
pos->data=number;
pos->left=NULL;
pos->right=NULL;
}
else
{
pos=b.root;
while(pos)
{
if(number>pos->data)
{
if(pos->right==NULL)
{
pos->right=(BST_NODE*)malloc(sizeof(BST_NODE));
pos->right->left=NULL;
pos->right->right=NULL;
pos->right->data= number;
pos=pos->right;
}
else
{
pos->right->data= number;
pos=pos->right;
}
}
if(number<pos->data)
{
if(pos->left==NULL)
{
pos->left=(BST_NODE*)malloc(sizeof(BST_NODE));
pos->left->left=NULL;
pos->left->right=NULL;
pos->left->data=number;
pos=pos->left;
}
else
{
pos->left->data=number;
pos=pos->left;
}
}
}
}
}
print(b.root);
return 0;
}
我不知道这段代码有什么问题,因为它只能接收2个值然后停止工作。到目前为止我唯一发现的问题是while(pos)循环,我试着解决这个问题。如果有人帮我解决这个问题,我将不胜感激。打印出来会很棒。 P.S -stop工作意味着我运行程序的窗口只是冻结或挂起。
答案 0 :(得分:1)
一旦break
新节点,您希望while(pos)
循环出malloc
。你完成插入所以停止工作。
此外,您不希望在遍历->data
分支中的树时覆盖所有else
值。
答案 1 :(得分:0)
向树中添加值时,看起来总是用输入数替换现有值,而不是仅仅遍历到下一级。删除
pos->right->data = number;
并且
pos->left->data = numbér;
来自main()
您还应该在左侧节点检查之前添加“else”。就目前而言,每次循环都会检查右分支然后检查左分支。如果您检查右侧分支并进行点击,您也将始终检查左侧分支。可能不是问题,但不必要。
不确定这是'它停止工作'的原因,因为'它停止工作'是非常模糊的,但这看起来很可疑。
此外...