• 3143 二叉树的序遍历——http://codevs.cn/problem/3143/


    第一部分:题目

    题目描述 Description

    求一棵二叉树的前序遍历,中序遍历和后序遍历

    输入描述 Input Description

    第一行一个整数n,表示这棵树的节点个数。

    接下来n行每行2个整数L和R。第i行的两个整数Li和Ri代表编号为i的节点的左儿子编号和右儿子编号。

    输出描述 Output Description

    输出一共三行,分别为前序遍历,中序遍历和后序遍历。编号之间用空格隔开。

    样例输入 Sample Input

    5

    2 3

    4 5

    0 0

    0 0

    0 0

    样例输出 Sample Output

    1 2 4 5 3

    4 2 5 1 3

    4 5 2 3 1

    数据范围及提示 Data Size & Hint

    n <= 16

    第二部分:思路

    首先要了解三种遍历:

    1,前序遍历:根节点、左节点、右节点

    2,中序遍历:左节点、根节点、右节点

    3,后序遍历:左节点、右节点、根节点

    其次需要知道怎么存储二叉树。这里为了方便获取每个根节点的左右节点,使用的是二维数组,s[*][3],其中*+1表示当前节点编号。存储的是根节点、左节点、右节点。

    接下来就是遍历的问题了,对于前序遍历,从根节点1开始,先打印根节点1,然后判断1的左节点是否为0;如果不为0,把以该节点为根节点的子树进行前序遍历;接着判断1的右节点是否为0,不为0则打印。

    可以看出出现了递归。其他两种遍历原理一样,只是顺序不同,不再说明。

    (PS:如果有什么意见或者建议,欢迎留言,看到一定回复)

    第三部分:代码

    #include<stdio.h>
    void forward(int s[32][3],int len,int index)
    {
        printf("%d ",s[index][0]);//根节点
        if(s[index][1]!=0)
        {
            forward(s,len,s[index][1]-1);//左节点,减1是因为根节点所在的行是从0开始的。
        }
        if(s[index][2]!=0)
        {
            forward(s,len,s[index][2]-1);//右节点
        }
    }
    void middle(int s[32][3],int len,int index)
    {
        if(s[index][1]!=0)
        {
            middle(s,len,s[index][1]-1);
        }
        printf("%d ",s[index][0]);
        if(s[index][2]!=0)
        {
            middle(s,len,s[index][2]-1);
        }
    }
    void backforward(int s[32][3],int len,int index)
    {
        if(s[index][1]!=0)
        {
            backforward(s,len,s[index][1]-1);
        }
        if(s[index][2]!=0)
        {
            backforward(s,len,s[index][2]-1);
        }
        printf("%d ",s[index][0]);
    }
    
    int main()
    {
        int n,i,s[16][3],len=0,x,y;
        scanf("%d",&n);
        for(i=0;i<n;i++)
        {
            s[len][0]=i+1;//当前根节点
            scanf("%d %d",&x,&y); 
            s[len][1]=x;//左节点
            s[len++][2]=y;//右节点
        }
        //前序遍历:根节点、左节点、右节点
        forward(s,len,0);
        //中序遍历:左节点、根节点、右节点
        printf("
    ");
        middle(s,len,0); 
        //后序遍历:左节点、右节点、根节点 
        printf("
    ");
        backforward(s,len,0); 
        return 0;
    
    }
  • 相关阅读:
    redhat linux 5.6 下安装oracle 11g 时netca报错不能配置监听解决方法
    数据库迁移windows>linux ORACLE 10G
    RedHat Linux 5.3 下安装ORACLE 软件之后手动安装数据库脚本记录
    X Server/Client
    Oracle实例解析:编码与字符集(转)
    RedHat Linux 5.3 下安装ORACLE DATABASE 10G
    Toad 10.5 连接RedHat Linux 5.3 下Oracle 10g
    RedHat5.6 安装mysql
    oracle 数据库开发原则(转自求道的路上)
    第一篇使用windows live writer发布日志
  • 原文地址:https://www.cnblogs.com/xiangguoguo/p/5346520.html
Copyright © 2020-2023  润新知