算法笔记 二叉树已知后序与中序输出前序[二叉树 前序遍历] HERODING的算法之路

Posted HERODING23

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法笔记 二叉树已知后序与中序输出前序[二叉树 前序遍历] HERODING的算法之路相关的知识,希望对你有一定的参考价值。

二叉树已知后序与中序输出前序。
后序:3, 4, 2, 6, 5, 1(左右根)
中序:3, 2, 4, 1, 6, 5(左根右)

解题思路:
递归的方式,每次输出根节点,因为前序遍历的每个点都是大大小小子树的根节点,明白这个一切都好说了。因为后序的最后一个总是根结点,令i在中序中找到该根结点,则i把中序分为两部分,左边是左子树,右边是右子树。因为是输出先序(根左右),所以先打印出当前根结点,然后打印左子树,再打印右子树。左子树在后序中的根结点为root – (end – i + 1),即为当前根结点-(右子树的个数+1)。左子树在中序中的起始点start为start,末尾end点为i – 1.右子树的根结点为当前根结点的前一个结点root – 1,右子树的起始点start为i+1,末尾end点为end。代码如下:

#include <cstdio>
using namespace std;
int post[] = {3, 4, 2, 6, 5, 1};
int in[] = {3, 2, 4, 1, 6, 5};
void pre(int root, int start, int end) {
    if(start > end) return ;
    int i = start;
    while(i < end && in[i] != post[root]) i++;
    printf("%d ", post[root]);
    pre(root - 1 - end + i, start, i - 1);
    pre(root - 1, i + 1, end);
}

int main() {
    pre(5, 0, 5);
    return 0;
}

参考链接

以上是关于算法笔记 二叉树已知后序与中序输出前序[二叉树 前序遍历] HERODING的算法之路的主要内容,如果未能解决你的问题,请参考以下文章

前序序列和后续序列确定二叉树

(Java)构造二叉树OJ题(LeetCode105 根据前序与中序构造二叉树,LeetCode106 根据后序与中序构造二叉树)

leetcode-105,106 从前序与中序遍历序列构造二叉树,从中序与后序遍历序列构造二叉树

构造二叉树集锦

二叉树19:构造二叉树两道题

LeetCode Java刷题笔记—105. 从前序与中序遍历序列构造二叉树