HDU 1710 Binary Tree Traversals(由遍历序列确立二叉树)

HDU 1710 Binary Tree Traversals(由遍历序列确立二叉树)

题目就是由先序和中序遍历确立一棵二叉树然后后序遍历输出
不懂的可以看看这个视频这个老师讲的很好

题目描述

二叉树是一组有限的顶点,它们要么是空的,要么由根r和两个不相交的二叉树(称为左子树和右子树)组成。有三种最重要的方法可以系统地遍历或排序二叉树的顶点。它们是前序、有序和后序。设T是根r和子树T1,T2的二叉树。

在T顶点的前序遍历中,我们先访问根r,然后访问前序中T1的顶点,然后访问前序中T2的顶点。

在T顶点的按序遍历中,我们按序访问T1的顶点,然后访问根r,然后按序访问T2的顶点。

在T的顶点的后序遍历中,我们以后序访问T1的顶点,然后以后序访问T2的顶点,最后访问r。

现在给出了某个二叉树的前序序列和无序序列。试着找出它的后序序列。img

输入

输入包含几个测试用例。每个测试用例的第一行包含一个整数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
#include<iostream>
#include<bits/stdc++.h>
#include<queue>
#include<vector>
using namespace std;
typedef long long ll;
const ll maxn=10005;
const ll MOD=1e9+7;
const ll INF=0x7fffffff;
struct BinNode{
    int data;
    BinNode *lc,*rc;
}*root;
BinNode* build(int *a,int *b,int n){
    BinNode *t;
    for(int i=1;i<=n;i++){
        if(a[1]==b[i]){
            t=new BinNode();
            t->data=b[i];
            t->lc=build(a+1,b,i-1);
            t->rc=build(a+i,b+i,n-i);
            return t;
        }
    }
    return NULL;
}
void travPost(BinNode *x){//后序遍历
    if(!x)return;
    else{
        travPost(x->lc);
        travPost(x->rc);
        if(x==root)cout<<x->data<<endl;
        else cout<<x->data<<" ";
    }
}
int main(){
    int n,a[maxn],b[maxn];
    while(cin>>n){
        for(int i=1;i<=n;i++)cin>>a[i];
        for(int i=1;i<=n;i++)cin>>b[i];
        root=build(a,b,n);
        travPost(root);
    }
	return 0;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值