CODE[VS] 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.访问右子树(同上循环……)

 

上图的先序遍历为:ABDECF

 

因为先访问根节点,所以叫先序。

 

那么中序和后序遍历也就很明显了。

 

中序遍历规则:

1.访问左子树(根据中序遍历规则)

2.访问根节点

3.访问右子树(根据中序遍历规则)

 

上图的中序遍历为:DBEAFC

 

后序遍历规则:

1.访问左子树

2.访问右子树

3.访问根节点

 

上图的后序遍历为:DEBFCA

 

到这里,再回去看样例,先把样例弄明白。

 

那就是三个搜索。

按照各自序遍历的规则来写就好了。

 

ac代码:👇

/*
作者:我颈椎不好
题目:p3143 二叉树的序遍历
*/

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;

int a[102][4],n;

void dfs1(int x)
{
    if(!x) return ;
    printf("%d ",x);
    dfs1(a[x][1]);
    dfs1(a[x][2]);
}

void dfs2(int x)
{
    if(!x) return ;
    dfs2(a[x][1]);
    printf("%d ",x);
    dfs2(a[x][2]);
}

void dfs3(int x)
{
    if(!x) return ;
    dfs3(a[x][1]);
    dfs3(a[x][2]);
    printf("%d ",x);
}

int main()
{
    scanf("%d",&n);
    for(int i=1; i<=n; i++)
    {
        a[i][0]=i;
        scanf("%d%d",&a[i][1],&a[i][2]);
    }
    dfs1(a[1][0]);
    printf("\n");
    dfs2(a[1][0]);
    printf("\n");
    dfs3(a[1][0]);
    return 0;
}

关于序遍历,还可参考blog:

https://www.cnblogs.com/turnips/p/5096578.html

 

posted @ 2018-06-07 08:53  孟东行#  阅读(222)  评论(0编辑  收藏  举报