数据结构实验之二叉树的建立与遍历

这道题它把空格的情况用‘ ,’来进行表示所以相对比较简单了……

对这题进行分析,先根据先序的顺序建立二叉树,再通过调用几个功能不同的函数进行不同效果的操作。

#include<stdio.h>  
#include<stdlib.h>  
#include<string.h>  
int sum=0;  
typedef struct node  //通过typedef自定义类型可以简化书写;
{  
    char data;  
    struct node*lc,*rc;  //定义一个左边的一个右边的结构体指针,(链表);
}tree,*tree1;  
tree1 build(tree1 t)  //二叉树构建函数;
{  
    char c;  
    c = getchar();  //一个一个的输入字符,再经行筛选;
    if(c==',')  
    {  
        t = NULL;  //','代表空;
    }  
    else  
    {  
        t = (tree1)malloc(sizeof(tree));//为t开辟空间,将当下的字符储存起来;  
        t->data = c;  
        t->lc = build(t->lc);  //递归调用根的左边;
        t->rc = build(t->rc);  //递归调用根的右边;
    }  
    return t;  //整体就是通过链表将二叉树建立起来,二叉树的建立通过递归调用分成左右两部分进行建立;
}  
void zx(tree1 t)  //进行中序遍历;
{  
    if(t!=NULL)  
    {  
        zx(t->lc); //根据二叉树的定义,如果左边不为空就输出; 
        printf("%c",t->data);  
        zx(t->rc);  //调用完左边之后在进行右边的调用;
    }  //注意这里在遍历的过程中,每个根始终是左右两边独立进行的;
}  
void hx(tree1 t)  //后序遍历;
{  
    if(t != NULL)  //通过这个条件可以找到递归的最小的根;
    {  
        hx(t->lc);  //根据后序遍历的要求调用的左边最后不再有分支了;
        hx(t->rc);  //根据后序遍历的要求调用的右边最后不再有分支了;
        printf("%c",t->data);  
    }  
}  
void leaf(tree1 t)  //查找叶子的个数;
{  
    if(t != NULL)  
    {  
        if(t->lc == NULL && t->rc == NULL)//根据叶子的定义左右应该都没有子树杈;  
        {  
            sum++;  
        }  
        else  //否则调用左右子叉;
        {  
            leaf(t->lc);  
            leaf(t->rc);  
        }  
    }  
}  
int deep (tree1 t)  //求深度;
    {  
        if(t!=NULL)  
        {  
            int a = deep(t->lc),b = deep(t->rc);  
            if(a > b)  //判断他们的子叉是否为空,但是由于左右子叉可能就一个为空,所以要求得最大深度;
            {  
                return a+1;  
            }  
            else  
            {  
                return b+1;  
            }  
        }  
        else  
        {  
            return 0;  
        }  
        return 0;  
    }  
int main()  
{  
    tree1 tree2=NULL;//重新开辟一个结构体,用来放排好的二叉树;  
    tree2=build(tree2);  
    zx(tree2);  
    printf("\n");  
    hx(tree2);
    printf("\n");  
    leaf(tree2);  
    printf("%d\n%d\n",sum,deep(tree2));  
    return 0;  
}  
连接  http://acm.sdut.edu.cn/sdutoj/showproblem.php?pid=2136&cid=1145

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值