二分搜索:请告诉我这里有什么不对

时间:2013-06-26 19:04:06

标签: error-handling binary-tree

我尝试了二叉树数据结构,但发现它不起作用并发出错误。请更正我的代码。谢谢!

它会发出警告,但main中的输入会停止运行。

#include<stdlib.h>
#include<stdio.h>
typedef struct
{
    int item;
    struct node * leftc;
    struct node * rightc;
}node;

void create(int key, node **tree )
{
    if(*tree ==0)
    {
        (*tree)= (node *)malloc(sizeof(node *));
        (*tree)->item=key;
        (*tree)->leftc=((*tree)->rightc)=NULL;
    } 
    else
{
    if(key >= (*tree)->item )
    {
        create(key, &((*tree)->rightc));
    }
    else if(key<(*tree)->item)
    {
        create(key, &((*tree)->leftc));
    }
}
}

node * search(int key, node * tree)
{
    if(tree !=NULL)
    {
      if(key == tree->item)
        return tree;
      else if(key > tree->item)
        search(key, tree->rightc);
      else
        search(key, tree->leftc);
    }
  return NULL;
}

void cut(node * tree)
{
  if(tree != NULL)
  {
    cut(tree->leftc);
    cut(tree->rightc);
    free(tree);
  }
}

void print_preorder(node * tree)
{
if (tree) {
 printf("%d\n",tree->item);
 print_preorder(tree->leftc);
 print_preorder(tree->rightc);
}
}


int main()
{
   node * root=NULL;
 create(9,&root);
 create(16,&root);
 create(24,&root);
 create(6,&root);

 return 0;

}

2 个答案:

答案 0 :(得分:0)

我知道这不会回答您关于错误的问题,但我发现您的search()功能存在严重问题。如果它是第一个放入函数的节点,您只返回您正在寻找的节点。对search()的递归调用不会返回任何内容。该函数应如下所示:

node * search(int key, node * tree)
{
    if (tree !=NULL)
    {
        if (key == tree->item) {
            return tree;
        } else if (key > tree->item) {
            return search(key, tree->rightc);
        } else if (key < tree->item) {
            return search(key, tree->leftc);
        }
    }
    return NULL;
}

此外,在您的create()功能中,您的意思是检查if (*tree == NULL)而不是if (*tree == 0)吗?

答案 1 :(得分:0)

更改

typedef struct
{
    int item;
    struct node * leftc;
    struct node * rightc;
}node;

typedef struct node
{
    int item;
    struct node * leftc;
    struct node * rightc;
}node;

在您的结构中,您可以参考结构节点&#39;所以你需要这个名字才能正确引用自己。当然,在typedef之后,你可以将它称为节点。

测试程序已编译并使用其他方式运行正常。