主题:求助:怎么用C语言来实现二叉树的建立和编历
逍遥王
[专家分:80] 发布于 2006-06-03 21:26:00
我的数据结构总是编不成,建立树的时候退不出来,请那位高手写一个完整的程序
回复列表 (共4个回复)
沙发
kurlez [专家分:200] 发布于 2006-06-04 00:02:00
二叉树很复杂吗?退不出来是什么意思?
struct bt_node
{
int value;
struct bt_node *lchild;
struct bt_node *rchild;
};
不就可以搞定了吗?
如果用C++的话,就更简单了。
板凳
goal00001111 [专家分:4030] 发布于 2006-06-04 10:45:00
二杈排序树的生成(插入)
先讨论向一个二杈排序树b中插入一个结点s的算法:
1。若b是空树,则将s所指结点作为根结点插入,否则
2。若s->data等于b的根结点的数据域之值,则什么也不做,或者在结构中增添一个标记,表示该结点
数据出现的次数;否则
3。若s->data小于b的根结点的数据域之值,则把s所指结点插入到左子树中;否则
4。把s所指结点插入到右子树中
void insert(btree **b, btree *s)
{
if(*b == NULL)
*b = s;
else if((*b)->data == s->data)//不做任何插入操作
;
else if((*b)->data > s->data)//把s所指结点插入到左子树中
insert(&((*b)->lchild), s);
else //把s所指结点插入到右子树中
insert(&((*b)->rchild), s);
}
生成二杈排序树的过程是先有一个空树b,然后向该空树插入一个个结点实现的,因此,
根据用户输入的一系列正整数(以-1为结束标志)生成一棵二杈排序树的函数如下:
void Creat(btree *b)
{
ElemType x;
btree *s;
b = NULL;
do
{
scanf("%d", &x);
s = (btree*)malloc(sizeof(btree));
if(s == NULL)
{
puts("wrong");
exit(1);
}
s->data = x;
s->lchild = s->rchild = NULL;
insert(&b, s); //插入一个结点s
} while(x != -1);
}
或者直接一个函数搞定:
btree* insert(btree *b, char x)
{
if(b == NULL)
{
b = (btree*)malloc(sizeof(btree));
if(b == NULL)
{
puts("wrong");
exit(1);
}
b->data = x; //putchar(x);
b->lchild = b->rchild = NULL;
}
else if(b->data == x)//不做任何插入操作
;
else if(b->data > x)//把s所指结点插入到左子树中
b->lchild = insert(b->lchild, x);
else //把s所指结点插入到右子树中
b->rchild = insert(b->rchild, x);
return b;
}
3 楼
henryliuch [专家分:290] 发布于 2006-06-04 12:43:00
楼上的程序确实精彩啊,看来学习数据结构的路还很长啊
可是还有些没有明白,比如那个exit(1)的含义是什么呢?
不过还是想请教一下二楼的这位朋友,生成二叉树有什么好的的方法呢?
我在我们的教材上学的是树的结点用层号表示,然后再输入的,有没有另外一种方法呢?
4 楼
goal00001111 [专家分:4030] 发布于 2006-06-04 16:38:00
exit(1);的意思是异常退出程序.方法我只知道这些了.
我来回复