我是一名计算机工程专业的学生,​​我必须写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/

10-12 15:01