文章
10
粉丝
66
获赞
3
访问
45.3k
解析:
题目大意:给出二叉树的中序和后序遍历,求前序遍历的最后一个结点。
用套路的建树再中序遍历是可以做的,时间给得很充足。不建树也可以做,由于前序遍历的顺序是根左右,那么寻找前序遍历最末项的方法为:
1、先看根结点有没有右子树,有就往右子树找;
2、如果没有右子树,则看有没有左子树,有就往左子树找;
3、如果左子树也没有,那么这个根结点就是结果。
而根据中序和后序就能得到每个结点的左子树和右子树。
#include <vector>
#include <iostream>
using namespace std;
void test () {
int N, i;
scanf("%d", &N);
vector<int> in(N), post(N);
for (i = 0; i < N; i++) scanf("%d", &post[i]);
for (i = 0; i < N; i++) scanf("%d", &in[i]);
int in1 = 0, in2 = N - 1, post1 = 0, post2 = N - 1;
while (in1 < in2) {
int root = post[post2];
i = in1;
// 在中序中找到根的序号
while (in[i] != root) i++;
if (i < in2) { // 有右子树,往右子树找
in1 = i + 1;
post1 = post2 - (in2 - i);
post2--;
} else if (i > in1) { // 有左子树,往左子树找
in2 = i - 1;
post2 = post1 + (i - in1) - 1;
} else { // 叶子结点,即为结果
...
登录后发布评论
暂无评论,来抢沙发