我是一名计算机工程专业的学生,我必须写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)loop,我尝试修复这一周。如果有人帮助我解决此问题,我将不胜感激。打印出来会很棒。
PS-停止工作意味着我在冻结或挂起程序时运行的Windows。
最佳答案
当您向树中添加值时,看起来总是用输入数字替换现有值,而不是遍历下一级。去掉
pos->right->data = number;
和
pos->left->data = numbér;
从main()
您还应该在左节点检查之前添加“ else”。就目前而言,您要在循环中每次检查右分支,然后检查左分支。如果您检查右边的分支并取得成功,那么您也将始终检查左边的分支。可能不是问题,但不必要。
不确定这是“它停止工作”的原因,因为“它停止工作”是个令人毛骨悚然的模糊问题,但对我而言,这可疑。
另外...
缩进要一致。有时缩进比其他时候更多
在结构定义和Breen函数声明之间添加空格。将这些内容视为书中的章节。使用空格可以使分开的东西清楚地分开。
在循环中添加提示,以指示它正在等待输入。如果您认为自己的应用已冻结,则可能只是在等待输入
在print()的开头添加一个检查,并明智地处理空根。如果您是第一次输入负数作为输入,则可能会发生这种情况。缺少此类检查并输入否定词可能会导致您的第一次输入崩溃。
哦!并使用calloc()而不是malloc()。 Calloc将新内存初始化为空,而malloc不初始化。 Malloc只是为您提供碰巧会给您的任何内存,包含它可能包含的任何随机垃圾。如果您使用calloc,则记忆不良的问题会少一些。
关于c - 谁能帮我二进制搜索树,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20794635/