PAT 1138 Postorder Traversal(二叉树的存储和遍历)

题目链接:点击打开链接

题意:给出二叉树的前序和中序遍历,给出其后序遍历的第一个元素。

思路:根据前序和中序遍历的结果得到二叉树的具体构造,再进行后序遍历。

代码:

#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
int pre[50010],in[50010];
int lSon[50010],rSon[50010];//按照前序遍历存 
int BuildTree(int l1,int l2,int num){//前序和中序遍历对于两个数组的起始位置;当前子树的元素数量 
	if(num <= 0) return -1;
	int ro,index;
	ro = l1;
	index = l2;
	while(in[index++] != pre[ro]);
	lSon[ro] = BuildTree(l1 + 1,l2,index - l2 - 1);
	rSon[ro] = BuildTree(l1 + index - l2,index,num - index + l2);
	return ro;
}
int PostOrder(int root){
	if(lSon[root] != -1){
		return PostOrder(lSon[root]);
	}
	else if(rSon[root] != -1){
		return PostOrder(rSon[root]);
	}
	else return root;
} 
int main(){
	int n,root,re;
	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]);
	}
	root = BuildTree(0,0,n);
	re = PostOrder(root);
	printf("%d\n",pre[re]);
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值