题目大意:
给出二叉树前序遍历和中序遍历,要求输出后序遍历第一个数。
解题思路:
用前序和中序构建二叉树时递归返回的第一个节点就是后序遍历的第一个数。
代码如下:
#include<iostream>
using namespace std;
int in[50010],pre[50010],n;
struct node
{
int data;
node* lchild;
node* rchild;
};
int num=1;
node* create(int prel,int prer,int inl,int inr)
{
if(prel>prer)return NULL;
node* root=new node;
root->data=pre[prel];
int cur;
for(int i=inl;i<=inr;i++)
{
if(in[i]==root->data)
{
cur=i;
break;
}
}
int numleft=cur-inl;
root->lchild=create(prel+1,prel+numleft,inl,cur-1);
root->rchild=create(prel+numleft+1,prer,cur+1,inr);
if(num==1)
{
printf("%d\n",root->data);//后序遍历第一个点
num++;
}
return root;
}
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]);
node* root=create(0,n-1,0,n-1);
return 0;
}