Tree Traversals
解答:
前序遍历递归会自动给根节点的左右根节点赋值,当用map来保存数据,map会自动按index从小到大排序,结束后只需遍历输出map即可得到前序遍历结果
下面是萌神柳婼的解法:
1.如何做到一个i既在中序中用又在后序中用???
i是中序遍历中根节点序号
因为由后序遍历图解可知,i序号前面的为左子树,i序号后面的为右子树!!!
#include <cstdio>
#include <vector>
#include <map>
using namespace std;
vector<int> post, in;
map<int, int> level;
void pre(int root, int start, int end, int index) {
if(start > end) return ;
int i = start;
//在中序中找到根节点位置i,划分左子树与右子树
while(i < end && in[i] != post[root]) i++;
level[index] = post[root];
pre(root - 1 - end + i, start, i - 1, 2 * index + 1);
pre(root - 1, i + 1, end, 2 * index + 2);
}
int main() {
int n;
scanf("%d", &n);
post.resize(n);//后序遍历序列预留空间n
in.resize(n);//中序遍历预留空间n
//数据读入
for(int i = 0; i < n; i++) scanf("%d", &post[i]);
for(int i = 0; i < n; i++) scanf("%d", &in[i]);
//开始前序递归
pre(n-1, 0, n-1, 0);
//数据输出
auto it = level.begin();
printf("%d", it->second);
while(++it != level.end()) printf(" %d", it->second);
return 0;
}
2.为什么代表前序遍历的序号index,在左子树递归时变成了2index+1,在右子树递归时变成了2index+2???
因为在前序遍历中,对一个序号为index的根节点,它的左根节点的序号为2index+1,右根节点序号为2index+2.
如下图所示:
3.前序遍历递归左子树右子树的代码传参(root-(end-i+1))为啥这么传见下:root是后序遍历中最后一个序号