任何人都可以帮助我使用我的二叉搜索树

时间:2013-12-27 04:14:28

标签: c binary-search-tree

我是一名计算机工程专业的学生,​​我必须写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工作意味着我运行程序的窗口只是冻结或挂起。

2 个答案:

答案 0 :(得分:1)

一旦break新节点,您希望while(pos)循环出malloc。你完成插入所以停止工作。

此外,您不希望在遍历->data分支中的树时覆盖所有else值。

答案 1 :(得分:0)

向树中添加值时,看起来总是用输入数替换现有值,而不是仅仅遍历到下一级。删除

pos->right->data = number;

并且

pos->left->data =  numbér;

来自main()

您还应该在左侧节点检查之前添加“else”。就目前而言,每次循环都会检查右分支然后检查左分支。如果您检查右侧分支并进行点击,您也将始终检查左侧分支。可能不是问题,但不必要。

不确定这是'它停止工作'的原因,因为'它停止工作'是非常模糊的,但这看起来很可疑。

此外...

  • 在缩进上保持一致。有时缩进比其他时间更多空间
  • 在结构定义和Breen函数声明之间添加空格。把这些东西想象成书中的章节。使用空格将单独的东西分开。
  • 在循环中添加一个提示,表示它正在期待输入。如果您认为您的应用已冻结,则可能只是在等待输入
  • 在print()的开头添加一个检查并合理地处理空根。如果您第一次输入负数作为输入,则可能会发生这种情况。缺少这样的支票并输入否定作为您的第一个输入可能会崩溃。
  • 哦!并使用calloc()而不是malloc()。 Calloc将新内存初始化为空值,而malloc则不是。 Malloc只是为你提供了它给你带来的任何内存,包含它可能包含的随机垃圾。如果你使用calloc,你对内存不好的问题就不那么可能了。