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

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(使用前将#替换为@)

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

  • Haskell printf 转字符串

    Haskell 中有等效的 sprintf 吗 我需要将双精度值转换并格式化为字符串 有没有其他方法而不使用printf什么样的功能 主要问题是要避免 Prelude gt putStrLn myDoubleVal 1 7944444444
  • string.Equals() 和 == 运算符真的相同吗? [复制]

    这个问题在这里已经有答案了 它们真的一样吗 今天 我遇到了这个问题 这是立即窗口的转储 s Category tvi Header Category s tvi Header false s Equals tvi Header true s
  • 我的程序替换了链表中所有节点中的所有字符串数据类型

    我有一个程序 基本上将历史记录 节点 添加到员工记录 链接列表 中 这是我的代码 include
  • Python - 如何在 Python 中剪切字符串?

    假设我有以下字符串 http www domain com s some two 20 怎样才能脱掉之后的东西 包括 并有这个字符串 http www domain com s some 好吧 回答眼前的问题 gt gt gt s http
  • 如何删除Python中特定字符之前的所有字符?

    我想删除指定字符或字符集之前的所有字符 例如 intro lt gt I m Tom 现在我想删除 lt gt before I m 或者更具体地说 I 有什么建议么 Use re sub 只需匹配所有字符即可I然后将匹配的字符替换为I r
  • Dart如何向字符串数字添加逗号

    我正在尝试适应这一点 在数字字符串中插入逗号 https stackoverflow com questions 721304 insert commas into number string在 Dart 工作 但没有运气 其中任何一个都不
  • 将 struct* 从 C# 传递到 C++ dll

    C dll中的结构体定义如下 struct WAVE INFO int channel num int audio type char wave data int wave length 调用方法如下 extern C STRUCTDLL
  • 从字符串中删除特定字符[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 如何从字符串中删除特定字符 我有一个 Arraylist 测试数组 String line testingarray get index
  • 代表和结构的速度问题

    我遇到了一些与结构和委托有关的速度问题 采用以下控制台应用程序代码 public delegate string StringGetter public class LocalString public LocalString string
  • 用 ruby​​ 中的数组内容替换字符串?

    String Test string Test array link1 link2 如何替换这样的字符串 输出应该是String link1 string link2 字符串 gsub 可以返回一个枚举器 所以这很简单 string gsu
  • 如何从 ctype 结构构建 python 字符串?

    我正在使用 ctypes 并且定义了这个结构体以便传递参数 class my struct ctypes Structure fields buffer ctypes c char BUFSIZE size ctypes c int 然后我
  • 为什么 String 类扩展了 Object

    看着String类声明 你可以看到它扩展了Object class public final class String extends Object implements Serializable Comparable
  • 从数组中提取值并将其转换为字符串的最佳方法是什么(允许 ES6)?

    我正在尝试采用这样的数组 location Id 000 000 Name Foo Id 000 001 Name Bar etc 提取 Id 并将它们组合成单个字符串 同时在每个值前面附加一个静态字符串 myId 的最有效 最干净的方法是
  • Golang 基础知识 struct 和 new() 关键字

    我正在学习 golang 当我阅读描述结构的章节时 我遇到了初始化结构的不同方法 p1 passport var p2 passport p3 passport Photo make byte 0 0 Name Scott Surname
  • C 中的空结构

    我有一个没有成员的结构 目前 我想知道是否可以抑制我收到的警告 warning struct has no members 是否可以添加会员并保留sizeof结构零 还有其他解决方案吗 在 c 中 空结构的行为取决于编译器 而在 c 中 空
  • ANSI-C:打印十进制整数的最大字符数

    我想知道这是否是确定打印小数的最大字符数的简单方法int I know
  • 2 批字符串问题

    1 是否有任何内置函数可以告诉我变量的内容是否仅包含大写字母 2 有没有办法查看变量是否包含字符串 例如 我想查看变量 PATH 是否包含 Ruby 对于第 1 部分 findstr就是答案 您只需使用正则表达式功能即可errorlevel
  • 释放c循环中的子字符串

    我正在尝试为结构体的每个成员获取一个子字符串 structs 然后将该子字符串分配给temp struct 我遇到的问题是如何在每次迭代时释放子字符串 但是由于某种原因代码运行valgrind抛出一个Invalid read of size
  • 获取ERLANG中的最长公共子序列

    我是这个 ERLANG 的新手 我了解基础知识 这就像计划 但范围更广 我知道如何创建一个函数 但在创建一个获取最长公共子序列的函数时遇到问题 lcs str1 str2 是一个接受两个字符串并输出一个整数的函数 lcs algorithm
  • 不使用 length() 方法的字符串长度[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 如何在不使用字符串的情况下找到字符串的长度length String类的方法 str toCharArray length应该管用 或者怎么

随机推荐

  • 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上有人问起 所以自己写了一个递归算法 根据中序和先序 后序 建立树结构 这里需要说明的是 必须要知道中序序列 先序和后序可选的情况下才能推导出树结构 只知道后序先