目的:根據先序和中序,給出後序遍歷的第一個節點。
輸入:
N <= 50000 結點數字
先序序列
中序序列
輸出:
後序序列的第一個數字。
算法:
後序遍歷的第一個點,是最左下方的點。
若當前點有左子樹,那麼就在左子樹中找第一個點。如果沒有左子樹,就在右子樹中找。如果左右子樹都沒有,則當前點就是找到的點。
#include<stdio.h>
#include<vector>
using namespace std;
vector<int> preorder,inorder;
int n;
void findfirstkey(int prel,int prer,int inl,int inr)
{
if(prel==prer)
{
printf("%d",preorder[prel]);
return;
}
int k = preorder[prel];
int u = -1;
for(int i=inl;i<=inr;i++)
{
if(k == inorder[i])
{
u = i;
break;
}
}
int leftnum = u-inl;
if(leftnum!=0)
{
findfirstkey(prel+1,prel+leftnum,inl,inl+leftnum-1);
}else
{
findfirstkey(prel+1,prer,inl+1,inr);
}
}
int main()
{
scanf("%d",&n);
preorder.resize(n);
for(int i=0;i<n;i++)
{
scanf("%d",&preorder[i]);
}
inorder.resize(n);
for(int i=0;i<n;i++)
{
scanf("%d",&inorder[i]);
}
findfirstkey(0,n-1,0,n-1);
return 0;
}
反思:
有些手生