zoukankan      html  css  js  c++  java
  • 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;
    
    }
  • 相关阅读:
    POJ 3669 Meteor Shower(bfs)
    MongoDB 分片的原理、搭建、应用
    Linux下Mongodb安装和启动配置
    目录操作
    一阶段第四次整理(关于滚动条监听的进一步解释)
    HTML DOM 节点介绍(nodeName,nodeValue,nodeType)
    ASP.NET 开发人员应该知道的8个网站
    Java 里快如闪电的线程间通讯
    php-多态
    Winform控件学习-TreeView
  • 原文地址:https://www.cnblogs.com/xiangguoguo/p/5346520.html
Copyright © 2011-2022 走看看