算法笔记 二叉树已知后序与中序输出前序[二叉树 前序遍历] 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 根据后序与中序构造二叉树)