PTA1138:已知二叉树前序中序,求后序
题目以及测试样例
- 题目
- 测试样例
解题思路
首先定义以下全局变量:
int N;//树中节点个数
vector<int> pre;//存储前序序列
vector<int> in;//存储中序序列
bool flag=false;//由于题目只需要输出后序第一个数,故设置一个标志位,加快递归结束
后序遍历函数:
void postsearch(int prel,int inl,int inr)
{
if(inl>inr||flag==true) return;//flag加快进程,为true即表示已经输出了后序中的第一个节点
int i;
for(i=inl;i<=inr;i++)
{
if(in[i]==pre[prel]) {break;}
} //找子树根节点
postsearch(prel+1,inl,i-1);
postsearch(prel+i-inl+1,i+1,inr);
if(flag==false)
{
flag=true;
printf("%d", pre[prel]);
}//放到递归最后即是后序
}
最后一个if语句,放在postsearch递归函数最后(即已经遍历完了左子树和右子树,在第三次经过节点时再输出)这就是后序遍历的输出顺序,如果放在postsearch递归函数中间则为中序遍历,同理放在开头即是前序遍历
最后主函数:
int main(int argc, char * argv[])
{
scanf("%d",&N);
for(int i=0;i<N;i++)
{
int a;
scanf("%d",&a);
pre.push_back(a);
}
for(int i=0;i<N;i++)
{
int a;
scanf("%d",&a);
in.push_back(a);
}
postsearch(0,0,N-1);
return 0;
}
总结
重点理解后序遍历递归函数的逻辑