您的位置:首页 > 其它

递归实现二叉搜索树建立

2016-05-14 12:30 295 查看
写了个代码,然而就是运行崩溃,各种调试半天,发现还是不知道哪里错了

不抱希望的百度了下,发现网上竟然有典型错我与我的代码一样,唉。转载如下

#include <stdio.h>
#include <assert.h>
#include <stdlib.h>

typedef struct NODE
{
NODE * pleft;
NODE * pright;
int ivalue;
} node;

/*  错误示例,实际上这个函数并没有连接起新建的结点

void insert_bitree(node *pt, int value)
{

if(pt == NULL)
{
pt = (node *) malloc ( sizeof(node) );
pt->ivalue = value;
pt->pleft = NULL;
pt->pright = NULL;
return ;
}
else if( value < pt->ivalue)
{
insert_bitree(pt->pleft, value);
}
else
{
insert_bitree(pt->pright, value);
}

}

*/

void insert_bitree(node **ppt, int value) //递归方式1
{

if(*ppt == NULL)
{
*ppt = (node *) malloc ( sizeof(node) );
(*ppt)->ivalue = value;
(*ppt)->pleft = NULL;
(*ppt)->pright = NULL;
return ;
}
else if( value < (*ppt)->ivalue)
{
insert_bitree(&((*ppt)->pleft), value); //将指向指针的指针重定位到当前结点的pleft
}
else
{
insert_bitree(&((*ppt)->pright), value); //将指向指针的指针重定位到当前结点的pright
}

}

node* create_searchtree(node *t, int  temp)   //递归方式2
{
if (t == NULL) {    // 若当前树为空
t = (node *)malloc(sizeof(node) * 1);
if (t == NULL) {
printf("内存分配失败!\n");
exit(EXIT_FAILURE);
}
t->ivalue = temp;
t->pleft = NULL;
t->pright = NULL;
}else if (t->ivalue  > temp) {   // 如果比当前结点小,则插入左子树
t->pleft = create_searchtree(t->pleft, temp);
}else if (t->ivalue < temp){    // 如果比当前结点大,则插入右子树
t->pright = create_searchtree(t->pright, temp);
}

return t;
}

node * creat_bitree(int value[], int len) //非递归方式
{
int i, flag;

node *before;
node *tmp;
node *pt = (node *)malloc( sizeof(node) );

pt->ivalue = value[0];
pt->pleft = pt->pright = NULL;

flag = 0;
for(i = 1; i < len; i++)
{
tmp = pt;
while(tmp != NULL)
{
if ( value[i] < (tmp)->ivalue)
{
before = tmp; // 存储当前结点的位置
flag = -1;  //标志位,表明向左子树探索
tmp = (tmp)->pleft;

}
else
{
before = tmp;
flag = 1;
tmp = tmp->pright;
}

}

if(flag == -1) //将输入值插入当前结点的左子树
{
before->pleft = (node *) malloc (sizeof(node) );
before->pleft->ivalue = value[i];
before->pleft->pleft = before->pleft->pright = NULL;
}
else if( flag == 1)
{

before->pright = (node *) malloc (sizeof(node) );
before->pright->ivalue = value[i];
before->pright->pleft = before->pright->pright = NULL;
}

}

return pt;

}

void preorder(node *pt)  //先序访问二叉树
{
if(pt != NULL)
{
printf("%d\n", pt->ivalue);
preorder(pt->pleft);
preorder(pt->pright);
}
}

void postorder(node *pt)
{
if(pt != NULL)
{
postorder(pt->pleft);
postorder(pt->pright);
printf("%d\n", pt->ivalue);
}
}

int main()
{

int a[8] = {1, 2, 7, 4, 5, 19, 9, 3};
int len = sizeof(a) / sizeof(int);

#if 1
int i;
node *pt = (node *)malloc(sizeof(node));
assert(pt != NULL);
pt->ivalue = a[0];
pt->pleft = pt->pright = NULL;
for(i = 1; i < 8; i++)
{

//pt = create_searchtree(pt, a[i]);
insert_bitree(&pt, a[i]);

}
#else

node *pt = creat_bitree(a, len);

#endif

preorder(pt);

return 0;
}


源代码来自于:点击打开链接
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: