二叉树遍历
时间限制:1000 / 1000ms(Java /其他)内存限制:32768 / 32768K(Java /其他)
提交总数:11接受提交:2
问题描述
二叉树是一组有限的顶点,这些顶点为空或由根r和两个不相交的二叉树组成,分别称为左子树和右子树。有两种最重要的方法可以对二叉树的顶点进行系统遍历或排序。它们是预购,订购和后购。令T为具有根r和子树T1,T2的二叉树。
在T的顶点的遍历遍历中,我们访问根r,然后按顺序访问T1的顶点,然后按顺序访问T2的顶点。
在T的顶点的有序遍历中,我们按顺序访问T1的顶点,然后依次访问根r和按顺序访问T2的顶点。
在对T的顶点进行后遍历时,我们先访问T1的顶点,然后再访问T2的顶点,最后访问r。
现在,您将获得某个二叉树的预排序序列和有序序列。尝试找出其后置顺序。
输入项
输入包含几个测试用例。每个测试用例的第一行包含一个整数n(1 <= n <= 1000),即二进制树的顶点数。后接两行,分别指示预排序序列和有序序列。您可以假设它们始终对应于排他的二叉树。
输出量
对于每个测试用例,请打印一行以指定相应的后置顺序。
样本输入
9
1 2 4 7 3 5 8 9 6
4 7 2 1 8 5 9 3 6
样本输出
7 4 2 8 9 5 6 3 1
资源
HDU 2007春季编程竞赛
代码:
#include<iostream>
#include<cstdio>
#include<vector>
using namespace std;
typedef struct BiTNode
{
struct BiTNode *lchild;
struct BiTNode *rchild;
int data;
}BiTNode, *BiTree;
vector<int> q;
BiTree creatTree(int *in, int *pre, int n)
{
if(n <= 0)
return NULL;
else
{
BiTree T = new BiTNode();
T->data = pre[0];
int i;
for(i = 0; i < n; i++)
{
if(pre[0] == in[i])
break;
}
T->lchild = creatTree(in, pre + 1, i);
T->rchild = creatTree(in + i + 1, pre + i + 1, n - i - 1);
return T;
}
}
void postorderTraversal(BiTree BT)
{
if(BT)
{
postorderTraversal(BT->lchild);
postorderTraversal(BT->rchild);
//cout<<BT->data<<" ";
q.push_back(BT->data);
}
}
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
q.clear();
int in[10000];
int pre[10000];
BiTree T;
for(int i = 0; i < n; i++)
{
cin >> pre[i];
}
for(int i = 0; i < n; i++)
{
cin >> in[i];
}
T = creatTree(in, pre, n);
postorderTraversal(T);
for(int i=0;i<q.size();i++){
cout<<q[i];
if(i!=q.size()-1)cout<<" ";
}
cout<<endl;
}
return 0;
}