回 帖 发 新 帖 刷新版面

主题:求助:怎么用C语言来实现二叉树的建立和编历

我的数据结构总是编不成,建立树的时候退不出来,请那位高手写一个完整的程序

回复列表 (共4个回复)

沙发

二叉树很复杂吗?退不出来是什么意思?

struct bt_node
{
   int value;
   struct bt_node *lchild;
   struct bt_node *rchild;
};

不就可以搞定了吗?

如果用C++的话,就更简单了。

板凳

二杈排序树的生成(插入)
    先讨论向一个二杈排序树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 楼

楼上的程序确实精彩啊,看来学习数据结构的路还很长啊
可是还有些没有明白,比如那个exit(1)的含义是什么呢?
不过还是想请教一下二楼的这位朋友,生成二叉树有什么好的的方法呢?
我在我们的教材上学的是树的结点用层号表示,然后再输入的,有没有另外一种方法呢?

4 楼

exit(1);的意思是异常退出程序.方法我只知道这些了.

我来回复

您尚未登录,请登录后再回复。点此登录或注册