文章

10

粉丝

66

获赞

3

访问

45.3k

头像
Preorder Traversal题解
P899 浙江大学2021年机试题
发布于2022年5月22日 12:34
阅读数 4.0k

解析:

题目大意:给出二叉树的中序和后序遍历,求前序遍历的最后一个结点。

用套路的建树再中序遍历是可以做的,时间给得很充足。不建树也可以做,由于前序遍历的顺序是根左右,那么寻找前序遍历最末项的方法为:

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 {  // 叶子结点,即为结果
        ...
登录查看完整内容


登录后发布评论

暂无评论,来抢沙发