1138 Postorder Traversal (25 point(s))(前序中序输出后序&不建树)

Suppose that all the keys in a binary tree are distinct positive integers. Given the preorder and inorder traversal sequences, you are supposed to output the first number of the postorder traversal sequence of the corresponding binary tree.

Input Specification:

Each input file contains one test case. For each case, the first line gives a positive integer N (≤ 50,000), the total number of nodes in the binary tree. The second line gives the preorder sequence and the third line gives the inorder sequence. All the numbers in a line are separated by a space.

Output Specification:

For each test case, print in one line the first number of the postorder traversal sequence of the corresponding binary tree.

Sample Input:

7
1 2 3 4 5 6 7
2 3 1 5 4 7 6

Sample Output:

3

题目大意:给出先序和中序,输出后序访问第一个结点。

分析:题目给出的结点个数上限为50000结点,因此排除建树做法。可以根据几种遍历的特点将先序和中序之间转出中序,然后设置flag访问一个结点后退出。

Code:

root是前序列表中代表根节点的点的下标 
inl ,inr 是中序遍历中当前处理的树的开始与结尾

#include<bits/stdc++.h>
using namespace std;
int n,pre[50010],in[50010];
bool flag=false;
void post(int root, int inl, int inr) {  
    if (inl > inr || flag == true) return;//加flag及时退出循环  
    int i = inl;  
    while(i < inr && in[i] != pre[root]) i++; 
    post(root + 1, inl, i - 1);   
    post(root + 1 + i - inl, i + 1,inr); 
    if(!flag) cout<<pre[root]<<endl;   
    flag=true;
}  

int main(){
	scanf("%d",&n);
	for(int i=0;i<n;i++) scanf("%d",&pre[i]);
	for(int i=0;i<n;i++) scanf("%d",&in[i]);
	post(0,0,n-1);
	return 0;
}

那么问题来了:如果给定中序和后序序列,如何输出前序序列(还是不建立二叉树的形式)???

下面我们对上述代码进行改写:

#include<bits/stdc++.h>
using namespace std;
int n,post[50010],in[50010];
void pre(int root, int inl, int inr) {  
    if(inl>inr ) return ;   
    int k = inl;  
    while(k < inr && in[k] != post[root]) k++;  
    int rightnum=inr-k;
    cout<<in[k]<<" ";  
	pre(root-1-(inr-k),inl, k - 1);  
    pre(root-1,k + 1,inr);   
}  

int main(){
	scanf("%d",&n);
	for(int i=0;i<n;i++) scanf("%d",&in[i]);
	for(int i=0;i<n;i++) scanf("%d",&post[i]);
	pre(n-1,0,n-1);
	return 0;
}

测试输出:

我们知道给定中序序列and先序/后序/层次遍历的一种,可以唯一确定一棵二叉树(先序/后序/层序的组合则不可以,因为只能确定父子关系,无法确定左右孩子关系,得到的树将不唯一)那么给定中序and层次序列,如何得到先序序列呢,建树的方式如何做,不建树的方式如何做呢 ???挖坑,明天写。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ZCAIHUI_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值