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

分析

参考
理论依据在参考中,这里简单说明一下
假 设 先 序 遍 历 序 列 为 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;
}

有错误望指正

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值