http://acm.hdu.edu.cn/showproblem.php?pid=1710
这是一道二叉树的建立与遍历的题目。
题意是给你先序和中的排列,输出后序排列。
首先介绍一下二叉树的三种遍历方式:
先序遍历:对于每个节点按照 父节点>左节点>右节点的顺序遍历。
中序遍历:对于每个节点按照 左节点>父节点>右节点的顺序遍历。
后序遍历:对于每个节点按照 左节点>右节点>父节点的顺序遍历。
因为是第一次写二叉树,所以还是有些虚。而且二叉树很多时候要用到递归进行操作,总觉得递归这玩意技巧性很强,不好掌控。
但是写起来还是比较顺利的,关键是理解他们之间的关系,尽管开始建树的时候递归边界没有处理好,但是很快还是被我发现了。
当然还有就是要注意输出的格式,最后一个数字不要加空格,由于被这一点坑过很多次,所以这次没有被坑。
最终1Y,心情舒畅。
这道题肯定有更加数学的方法,但是由于第一次做二叉树,所以就先用模拟吧。
#include <algorithm>
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
using namespace std;
int a[1005],b[1005],n;
int now_root;
struct tree
{
int x;
tree *child1,*child2;
};
void build(tree *fa,int l,int r)
{
int mid;
if(now_root==n) return;
for(mid=0; mid<n; mid++)
if(b[mid]==a[now_root]) break;
fa->x=a[now_root++];
if(mid!=l)
{
fa->child1=new tree;
build(fa->child1,l,mid);
}
else fa->child1=NULL;
if(mid!=r-1)
{
fa->child2=new tree;
build(fa->child2,mid+1,r);
}
else fa->child2=NULL;
}
void dfs(tree *fa)
{
if(fa)
{
dfs(fa->child1);
dfs(fa->child2);
printf("%d",fa->x);
if(fa->x!=a[0]) printf(" ");
}
}
int main()
{
tree *root;
root=new tree;
int i;
while(scanf("%d",&n)!=EOF)
{
now_root=0;
for(i=0; i<n; i++)
scanf("%d",&a[i]);
for(i=0; i<n; i++)
scanf("%d",&b[i]);
root=new tree;
build(root,0,n);
dfs(root);
printf("\n");
}
return 0;
}