无法在二叉搜索树中打印元素

时间:2015-04-27 12:15:55

标签: c data-structures binary-search-tree

我的代码不打印二叉搜索树的元素:

//x is the element to be inserted
//structure of program
 typedef struct BST
  {
  int info;
  struct  BST *left;
//pointer to left node

 struct BST *right;
//pointer to right node

 }
 bst;
//global root variable

bst *root;
void insert(int x)
{
    bst *ptr,*sptr=root;
    ptr=(bst*)malloc(sizeof(bst));
    ptr->info=x;
    if(root==NULL)
    {
        ptr->left=ptr->right=NULL;
        root=ptr;
    }
    while(sptr!=NULL)
    {
        if(x<sptr->info)
        {
            sptr=sptr->left;
        }
        else
            sptr=sptr->right;
    }
    sptr=ptr;
}

编辑:

 //following is the show function

   void show()
   {
    bst *ptr=root;
    while(ptr!=NULL)
    {

    //it will print untill the ptr is null

      printf("%d",ptr->info);
      ptr=ptr->left;
      ptr=ptr->right;
    }
  }

1 个答案:

答案 0 :(得分:1)

root的价值来自哪里?你没有在任何地方传递价值?此外,当我们不知道bst类型的设计时,很难提供帮助。

看来你有正确的想法。创建一个节点,并为其提供一些数据。如果root为null,则新值是BST的根。之后,继续使用标准BST行为在根的左侧或右侧子树中找到第一个空节点。最后,当你到达终点时,继续将最后一个节点插入适当的位置。

void insert(int x)
{
    bst *ptr, *sptr=root; //<-- the value right here?
    ptr = malloc(sizeof(bst));
    ptr->info = x;
    if(root == NULL)
    {
        ptr->left=ptr->right=NULL;
        root=ptr;
    }

    while(sptr!=NULL)
    {
        if(x<sptr->info)
        {
            sptr=sptr->left;
        }
        else
            sptr=sptr->right;
    }
    sptr=ptr; // <-- What is this line trying to do?
}

但是,您的更新树在哪里?

因为在C中,所有内容都是按值传递的,所以在您离开此函数后,您遇到的问题是您没有看到更新的树。您需要继续并更改函数以返回bst*类型,并在整个函数期间维护根节点。现在第一行代码(*sptr = root)更有意义!最后,您没有将ptr的左右字段设置为NULL。这意味着你跳过你的if语句。

bst* insert(int x, bst *root)
{
    bst *ptr, *sptr=root;
    ptr = malloc(sizeof(bst));

    ptr->left = NULL;
    ptr->right = NULL;

    ptr->info = x;
    if(root == NULL)
    {
        ptr->left=ptr->right=NULL;
        root=ptr;
        return root;
    }

    while(sptr!=NULL)
    {
        if(x<sptr->info)
        {
            sptr=sptr->left;
        }
        else
            sptr=sptr->right;
    }
    sptr=ptr;
    return root;
}

下一个功能怎么样?

我刚开始看这个。我不习惯c中的全局变量,所以我将继续进行两次修改。让我们做这个递归,并传递根的值,而不是使用全局。

void show(bst *root)
{
    if(root == NULL){
         return;
    }
    printf("%d",root->info);
    show(root->left);
    show(root->right);
 }

这将获取一些值,并以递归方式求解树,并在到达每个节点时进行打印。因此,它将打印根节点(如果存在),然后在打印右子树之前打印左侧整个左子树。

最后,查看您的主要

我添加了局部变量root,因此您必须在主函数之外删除名为root的全局变量。我还将它的值设置为null,以便您的第一个插入将正确触发。

int main()
{
  int i,n,x;
  bst *root = NULL; //<-- I added this line of code to remove the global
  puts("Enter number of elements");
  scanf("%d",&x);

  for(i=0;i<x;i++)
  {
      puts("Enter elements");
      scanf("%d",&n);
      root = insert(n, root);
  }
show(root);
return 0;
}

我希望这有帮助!