已知二叉树先序遍历和后序遍历序列,求可能的中序遍历序列及方案数

Posted 牧空

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了已知二叉树先序遍历和后序遍历序列,求可能的中序遍历序列及方案数相关的知识,希望对你有一定的参考价值。

分析

参考
理论依据在参考中,这里简单说明一下
假 设 先 序 遍 历 序 列 为 P r e , 后 序 遍 历 的 序 列 为 P o s t 记 其 中 一 个 结 点 为 v , 则 在 P r e 中 存 在 以 v 为 开 头 的 最 长 后 缀 P v 使 得 在 P o s t 中 有 以 v 为 结 尾 的 最 长 前 缀 S v 与 P v 中 元 素 相 同 假设先序遍历序列为Pre,后序遍历的序列为Post\\\\ 记其中一个结点为v,则在Pre中存在以v为开头的最长后缀P_v\\\\ 使得在Post中有以v为结尾的最长前缀S_v与P_v中元素相同 Pre,Postv,PrevPv使PostvSvPv
对于树
在这里插入图片描述
先序为ABDECF
后序为DEBFCA
以C为例,对于先序C之后不会出现B来干扰,所以不会 P v P_v Pv S v S_v Sv不会将兄弟结点加进来
已 经 获 取 了 P v 和 S v , 如 果 P v 的 第 一 个 元 素 等 于 S v 的 倒 数 第 一 个 元 素 说 明 v 只 有 一 个 子 树 , 那 么 类 型 数 量 就 要 翻 倍 已经获取了P_v和S_v,如果P_v的第一个元素等于S_v的倒数第一个元素\\\\ 说明v只有一个子树,那么类型数量就要翻倍 PvSv,PvSvv,

代码

#include <iostream>
#include <cstdio>
#include <string>
using namespace std;

int main(int argc, char const *argv[])
{
    string pre, post;
    cin >> pre >> post;
    int i = 0, sum = 1;
    while (i < pre.length() - 1)
    {
        int j = post.find(pre[i], 0);
        if (pre[i + 1] == post[j - 1])
            sum *= 2;
        i++;
    }
    printf("%d\\n", sum);
    return 0;
}

有错误望指正

以上是关于已知二叉树先序遍历和后序遍历序列,求可能的中序遍历序列及方案数的主要内容,如果未能解决你的问题,请参考以下文章

已知二叉树的中序序列和后序序列,怎么求前序序列

已知二叉树的先序序列和中序序列怎么求后序序列?不是基于C++的,要在TC环境下能运行的,各位能人帮帮忙吧

数据结构中已知前序序列和中序序列,怎么得出后序序列,谢谢回答!

构造一棵二叉树,并分别输出其先序遍历、中序遍历和后序遍历的结果

数据结构中已知前序序列和中序序列,怎么得出后序序列

通过二叉树的中序序列和后序序列获取前序序列