点击查看代码
#include<bits/stdc++.h>
using namespace std;
string in,post;
void preorder(int inl,int inr,int postl,int postr)
{
if(inl>inr||postl>postr) return;
//找到根节点并输出
char root=post[postr];
cout<<root;
//在中序排列中找到根节点
int k=inl;
while(in[k]!=root) k++;
int leftsize=k-inl;
//依次遍历左右树
preorder(inl,k-1,postl,postl+leftsize-1);
preorder(k+1,inr,postl+leftsize,postr-1);
}
int main()
{
cin>>in>>post;
int n=in.size();
preorder(0,n-1,0,n-1);
return 0;
}
、
本题的核心考察点实则是递归,因为没有涉及到关键的恢复状态,递归的逻辑就是遵从中序和后序遍历的规则,依次找到分割的根节点,然后递归对应的数,再输出根节点,直到最后一棵树为空。
此外,这道题是要把中序和后序结合起来的,后序列用来确定每一课数目的根节点,就是序列的最后一个元素。而中序则在根节点已知的情况下,求出左右树的节点数,以此再度划分左右树,这两者结合才可以输出先序
再此外,理解树遍历的原理也是很重要的,先序遍历是从根节点出发,然后直接输出根节点,到达左树碰到一个节点就输出一个,然后右边树同理。中序遍历则是从根节点出发到达左树到底然后向上回升直到回到根节点输出根节点然后到右树,到达树底,然后回升输出。后序遍历的思路基本一致,只不过是最后输出根节点,因此除了第一个根节点,中序和后序的节点顺序是一样的