这一题跟以前的一题类似,根据先序和中序得到其后序,只不过这一题只输出第一个后序的元素。
直接根据先序遍历和中序遍历进行获取,根据先序遍历的根节点得到中序遍历中其目标元素所在的范围left和right,重复上述过程,直到right-left等于1,即求得元素。这一题我采用循环来实现,其实用递归实现更好理解。难点主要在于要确定好什么时候停止。
#include <bits/stdc++.h>
using namespace std;
void getFirstOfPostOrder(int preOrder[],int inOrder [],int length){
int treeLeft = 0;
int treeRight = length;
int index = 0;
int eIndex = -1;
while(true){
for(int i =treeLeft ;i<treeRight;i++){
if(preOrder[index]==inOrder[i]){
//范围内只有一个节点 即目标节点
if(treeRight - treeLeft ==1){
eIndex = index;
index++;
break;
}
//节点为中序遍历范围内第一个节点 即没有左子树,就从右子树开始找
else if(i==treeLeft){
treeLeft++;
index++;
break;
}
//有左子树
else{
treeRight = i;
index++;
break;
}
}
}
if(eIndex>=0){
break;
}
}
printf("%d\n",preOrder[eIndex]);
}
int main()
{
int preOrder[50001];
int inOrder[50001];
int n;
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d",&preOrder[i]);
}
for(int i=0;i<n;i++){
scanf("%d",&inOrder[i]);
}
getFirstOfPostOrder(preOrder,inOrder,n);
return 0;
}