求一棵二叉树的前序遍历,中序遍历和后序遍历
第一行一个整数n,表示这棵树的节点个数。
接下来n行每行2个整数L和R。第i行的两个整数Li和Ri代表编号为i的节点的左儿子编号和右儿子编号。
输出一共三行,分别为前序遍历,中序遍历和后序遍历。编号之间用空格隔开。
5
2 3
4 5
0 0
0 0
0 0
1 2 4 5 3
4 2 5 1 3
4 5 2 3 1
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