已知树的中序序列和先序/后序序列,求树的结构?

2023-11-08

 已知树的中序序列和先序/后序序列,求树的结构?


这类问题比较经典了,刚好CSDN上有人问起,所以自己写了一个递归算法,根据中序和先序(后序)建立树结构。这里需要说明的是:必须要知道中序序列,先序和后序可选的情况下才能推导出树结构,只知道后序先序是推导不出。简单说明一下基本思路,例:
   已知后序: DEBGFCA  中序:DBEAFGC 求先序?或者求树结构?

因为有后序序列DEBGFCA,所以根节点为A,再根据中序序列,DBE|A|FGC,所以DBE肯定是左子树,FGC是右子树;再看左子树DBE,因为后序序列DEB,所以可以确定根节点为B,所以中序序列D|B|E可以分成D和E两个左子树,以此类推,这样就形成了一个递归过程。根据这个推断就很容易把树构造出来:

#include <string>
using namespace std;

typedef struct _BITREENODE
{
    _BITREENODE(){::memset(this, 0, sizeof(_BITREENODE));}
    char _data;
    _BITREENODE* _leftChild;
    _BITREENODE* _rightChild;
}BTreeNode, *PBTreeNode;

enum eBTreeType {bttPreOrder, bttLastOrder};

//找出字符相同(排列次序不同)
string IsContain(string strDes, string strSrc)
{
    string strTmp;
    bool bTmp = false;

    for (int i=0; i<strDes.length(); ++i)
    {
        strTmp = strDes.substr(i, strSrc.length());

        for (int j=0; j<strSrc.length(); ++j)
        {
            bTmp = false;
            for (int k=0; k<strTmp.length(); ++k)
            {
                if (strTmp.at(k) == strSrc.at(j))
                {
                    bTmp = true;
                }
            }
           
            if (!bTmp) break;
        }

        if (bTmp) break;       
    }

    return strTmp;
}

//如果出错就返回false
bool CreateBTree(string strMid, string strSec, PBTreeNode &pRoot, eBTreeType eBtt)
{
    string strTmp;
    if (strMid.empty() || strSec.empty()) return true;
    if (strMid.size() == 1
        && strSec.size() == 1
        && strMid.size() == strSec.size())
    {
        pRoot->_data = strSec.at(0);
        return true;
    }

    char ch;
    if (eBtt == bttPreOrder)            //先序
    {
        ch = strSec.at(0);
    }
    else if (eBtt == bttLastOrder)    //后序
    {
        ch = strSec.at(strSec.length()-1);
    }

    pRoot->_data = ch;
    pRoot->_leftChild = new BTreeNode;
    pRoot->_rightChild = new BTreeNode;
           
    //左子树
    int iPos = strMid.find(ch);
    if (iPos == string::npos) return false;
    strTmp = strMid.substr(0, iPos);
    string str = IsContain(strSec, strTmp);
    if (!str.empty())
    {
        if (!CreateBTree(strTmp, str, pRoot->_leftChild, eBtt))
            return false;
    }       

    //右子树
    strTmp = strMid.substr(iPos+1, strMid.length()-1-iPos);
    str = IsContain(strSec, strTmp);
    if (!str.empty())
    {
        if (!CreateBTree(strTmp, str, pRoot->_rightChild, eBtt))
            return false;
    }

    return true;
}


int main()
{
    int i;
    BTreeNode *pRoot = new BTreeNode;
    if (CreateBTree("DBEAFGC", "ABDECFG", pRoot, bttPreOrder))
    {
        system("echo Successed");
    }

    system("pause");
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

已知树的中序序列和先序/后序序列,求树的结构? 的相关文章

  • 替换 JSON 中的转义字符

    我想用空格替换 JSON 字符串中的 字符 我怎样才能做到这一点 我发现从 JSON 字符串中删除所有转义字符的最简单 最好的方法是将字符串传递到正则表达式 Unescape 方法 此方法返回一个没有转义字符的新字符串 甚至删除了 n t
  • 关于C字符串的问题

    我是 C 语言新手 对 C 字符串非常困惑 以下是我的问题 从字符串中查找最后一个字符 如何找出字符串中的最后一个字符 我带着类似的东西来 char str hello printf c str strlen str 1 return 0
  • 如何从Python列表中的字符串中删除双引号?

    我正在尝试在字典列表中获取一些数据 数据来自 csv 文件 因此都是字符串 文件中的键都有双引号 但由于这些都是字符串 我想删除它们 这样它们在字典中看起来像这样 key value 而不是这个 key value 我尝试简单地使用 str
  • 如何快速防止标签中出现孤儿?

    我有一个可以有一两行的标签 如果它有两行 我希望第二行至少有两个 或者可能三个 单词 而不仅仅是一个 关于如何使用 swift 实现这一点有什么想法吗 提前致谢 Daniel 编辑 我删除了我愚蠢的第一个想法 这些想法并没有真正的帮助 好吧
  • Objective-C 使用字符串池吗?

    我知道Java https stackoverflow com questions 3801343 what is string pool in java and C http msdn microsoft com en us librar
  • 如何从 PHP 中的字符串创建可能的字符串组合?

    如何从 PHP 中的字符串创建可能的字符串组合 Exp input abc output array 0 gt a 1 gt ab 2 gt abc 3 gt ac 4 gt acb 5 gt b 6 gt ba 7 gt bac 8 gt
  • 如何将 R 数据框中的多个字符列合并为单个列

    我正在处理人口普查数据 需要将四个字符列合并为一列 Example LOGRECNO STATE COUNTY TRACT BLOCK 60 01 001 021100 1053 61 01 001 021100 1054 62 01 00
  • 当第二个参数包含运算符号时,为什么 ltrim 会删除一个字符? [复制]

    这个问题在这里已经有答案了 If I do ltrim 53 34567 53 ltrim 53 34567 53 ltrim 53 34567 53 I get 4567作为结果而不是34567 这种行为的解释是什么 ltrim 53 3
  • 为什么 Java 11 中对于空白字符串 String.strip() 比 String.trim() 快 5 倍

    我遇到过一个有趣的场景 因为某些原因strip 针对空白字符串 仅包含空格 明显快于trim 在Java 11中 基准 public class Test public static final String TEST STRING 3 w
  • 更改特定字符串的颜色

    有谁知道如果将特定单词输入文本区域 我如何更改它的颜色 例如 如果用户输入 你好我的朋友 它会动态地将 你好 更改为绿色 在google上花了很多时间 找不到任何相关的东西 谢谢 textareas 的设计目的不是选择性着色
  • 从另一列的子字符串创建列

    我有一个 Pandas 数据框对象 我想从现有列的子字符串创建新列 我的数据如下所示 Date variable want1 want2 want3 0 02 01 08 Australia Sydney A Australia Sydne
  • 使用 Java 将摩尔斯电码转换为英文文本

    我最近有一项任务 将英语转换为摩尔斯电码 并将摩尔斯电码转换为英语 输入莫尔斯电码时 我的老师希望各个字母之间用 1 个空格分隔 单词之间用 分隔 例如 是 成为 我能够完美地将英语转换为莫尔斯电码 但我对莫尔斯电码转换为英语感到不知所措
  • 以类型化内存视图作为成员的结构定义

    目前我正在尝试让一个具有类型化内存视图的结构能够工作 例如 ctypedef struct node unsigned int inds 如果 inds 不是内存视图 据我所知 它可以完美地工作 然而 通过内存视图并使用类似的东西 def
  • 拆分/标记化/扫描字符串并注意引号

    Java中是否有默认 简单的方法来分割字符串 但要注意引号或其他符号 例如 给定以下文本 There s a man that live next door in my neighborhood and he gets me down Ob
  • 什么是仅匹配空字符串的正则表达式?

    有很多关于正则表达式的帖子来匹配潜在地空字符串 但我找不到任何提供正则表达式的字符串only匹配一个空字符串 我知道 将匹配任何行的开头并且 将匹配任何行的结尾以及字符串的结尾 像这样 匹配的内容远不止空字符串 如 n foobar n n
  • VBA 字符串 255 个字符限制

    我在使用 VBA 时遇到问题 并注意到它的字符串限制为 255 个字符 我实际上正在尝试通过 POST 发送 JSON 并暂停执行 我注意到该字符串始终只有 255 个字符 有没有办法调整字符串的大小或其他什么 我在这个问题上浪费了大约 6
  • 静态字符串文字表?

    在 C 中创建全局静态字符串表的正确方法是什么 我所说的 全局 是指 可从包含标头的任何文件中使用 但不是某些运行时创建的单一对象的一部分 我所说的 静态 是指 尽可能少地设置运行时间 只读内存页中的数据 每个应用程序只有 1 个数据实例
  • 将 numpy 代码点数组与字符串相互转换

    我有一个很长的 unicode 字符串 alphabet range 0x0FFF mystr join chr random choice alphabet for in range 100 mystr re sub W mystr 我想
  • 获取两个字符串之间的公共部分c# [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我需要的是获取两个单词之间的共同部分并获取差异 例子 场景1 word1 感言 word2 Test 将返回 公共部分Test 不同之
  • 删除Android所有语言中的字符串

    我有一个包含多个翻译的应用程序 我想删除一些字符串 我怎样才能重构并删除它们一次 例如在默认情况下strings xml文件并自动将删除传播到其他翻译的其他 strings xml 文件 您可以通过 Android Studio 中的 翻译

随机推荐

  • pandas数据处理基础——筛选指定行或者指定列的数据

    pandas主要的两个数据结构是 series 相当于一行或一列数据机构 和DataFrame 相当于多行多列的一个表格数据机构 本文为了方便理解会与excel或者sql操作行或列来进行联想类比 1 重新索引 reindex和ix 上一篇中
  • SPP空间金字塔池化(spatial pyramid pooling, SPP)原理与pytorc实现

    1 为什么需要SPP 过去的卷积神经网络CNN由卷积层 全连接层组成 其中卷积层对于输入数据的大小并没有要求 唯一对数据大小有要求的则是第一个全连接层 因此基本上所有的CNN都要求数据数据固定大小 例如著名的VGG模型则要求输入数据大小是
  • "ORA-00942: 表或视图不存在 "的原因和解决方法

    采用Oracle数据库 使用Powerdesigner设计 生成Sql文件导入后查询出现 ORA 00942 表或视图不存在 很是郁闷 这个问题以前出现过 当初解决了 但因好久没有使用 这次竟然忘了 害得我浪费了好些时间 为了避免再次忘记
  • 消息中间件(MQ)

    一 什么是消息中间件 关注于数据的发送和接收 利用高效可靠的异步消息传递机制集成分布式系统 通过提供消息传递和消息排队模型 它可以在分布式环境下扩展进程间的通信 二 为什么需要消息中间件 1 系统解耦 假设你有个系统A 这个系统A会产出一个
  • 数据治理总结

    项目背景 前提 参与人员均了解熟悉数据中心 业务痛点 始于一次吐槽大会 1 开发及使用人员信息不对称 2 表中字段增减随意 3 相似数据冗余 4 定制化表过多 扩展功能不足 维护成本高 5 缺少注释 全凭猜测 浪费时间 项目计划 1 确定治
  • [North Central NA Contest 2018] Rational Ratio

    Description Every positive rational number can be expressed as a ratio of two positive integers However in decimal form
  • 【目标检测】Towards Accurate One-Stage Object Detection with AP-Loss

    摘要 one stage目标探测器通过同时优化分类损失和定位损失进行训练 前者由于锚的数量众多而遭受极端的前景 背景类别失衡问题 本文提出了一个新颖的框架 以分级任务代替one stage检测器中的分类任务 并采用平均精度损失 AP los
  • flink学习39:tableAPI应用实例

    实例
  • linux下串口的安装和使用(ubuntu+usb转串口)

    转自 http blog csdn net u014416516 article details 39482183 安装 在终端中输入sudo apt get install minicom 配置 输入sudo minicom s 注意前边
  • 成功 打不开_【2019】Adobe XD 闪退白屏打不开的解决方法

    原文是微信公众号文章 原文链接 2019 关于 Adobe XD 闪退白屏打不开的解决方法 mp weixin qq com Adobe XD 作为一款战略地位超越 Photoshop 的一站式 UI UX 设计平台软件 每天有无数 UI
  • 电路(1) ——LC谐振电路

    最近小菜转行了 不再做软开 博客会更新一些电路分析的内容 从零开始学电分的第一天 加油
  • 元宇宙改变人类工作模式的四种方式

    想象一个世界 你可以与同事在海边交谈 在空间站周围漂浮时做会议记录 或者从你在伦敦的办公室传送到纽约 所有这些都无需走出你的前门 由于今天安排的会议太多而感到压力 那么为什么不发送支持 AI 的数字双胞胎来减轻你的负担呢 这些例子只是对 元
  • Echarts图表不显示

    Echarts图表不显示 div标签的style属性设置有问题 div style width 500px height 500px div
  • C++课程基础语法小结

    前言 每个人的记忆是有限的 学过的东西很快就会遗忘 因此 在即将升大二之际 对大一学习的C 的基础语法进行整理归纳 并附上一年里写过的一些重要代码 方便今后回顾 声明 本文参考教材提供的网络学习资料 非常感谢 网址已注明 代码为博主本人大一
  • 人体活动识别总结

    人体活动识别 活动识别过程 数据采集 数据预处理 窗口分割 特征提取 特征选择 活动分类 面临问题 人类活动识别 HAR 仍有许多问题促使新技术的发展 以提高在更现实的条件下的准确性 其中一些挑战是 1 要度量的属性选择 2 便携的 不显眼
  • 3D开发-PhotoScan 模型生成

    PhotoScan是一款图片转3D模型软件 需要商业license 其图片转3D模型效果非常好 是一款基于影响自动生成高质量三维模型的优秀软件 这对于3D建模需求来说实在是一把利器 图片转3D模型操作 Step1 选择工作流程 Step2
  • 虚拟现实(VR)在医疗保健中的5种应用

    医疗保健中的VR虚拟现实 虚拟现实的由来已久 18世纪 法国的医生使用布制的分娩模拟器向助产师和外科医生教授医学技术 在20世纪60年代初 医生一边对心肺复苏学员口述心肺复苏的技巧 一边使用一家塑料玩具厂家制造的塑料娃娃现场演示胸部按压和人
  • 安全(四):CSRF攻击

    csrf获取的不是用户的所有权限 获取的是用户在修改东西的时候 通过url权限修改信息 查看这里
  • MySQL-面试题

    第六章 决胜秋招 Section A 练习一 各部门工资最高的员工 难度 中等 创建Employee 表 包含所有员工信息 每个员工有其对应的 Id salary 和 department Id Id Name Salary Departm
  • 已知树的中序序列和先序/后序序列,求树的结构?

    已知树的中序序列和先序 后序序列 求树的结构 这类问题比较经典了 刚好CSDN上有人问起 所以自己写了一个递归算法 根据中序和先序 后序 建立树结构 这里需要说明的是 必须要知道中序序列 先序和后序可选的情况下才能推导出树结构 只知道后序先