zoukankan      html  css  js  c++  java
  • 序列节点根据前中后序和层序重建二叉树(PAT1020、PAT1043)

    在写这篇文章之前,xxx已经写过了几篇关于改序列节点主题的文章,想要了解的朋友可以去翻一下之前的文章

        欢送拜访新博客,这里有更好的排版哦 ; )  点击打开链接

        

        背景

        《二叉树的历遍(递归、非递归)分析》结总了二叉树不同历遍方法的递归和非递归现实,本文则论讨如何针对不同历遍方法的组合重建二叉树。为了简化问题的虑考,定假二叉树中不会涌现重复值。列入虑考围范的有序前、中序、后序、层序历遍这四种的组合。前中后序较比见常,而层序则绝对殊特一点了。

        PAT的1043和1020题是历遍关相的模板题,恰好派上用场。

        中序+序前

        法算描述:

        

    • 初始:用序前历遍序列定确根节点,在中序历遍序列中找到该根节点,则阁下子树别分为中序中该节点阁下的序列。
    • 迭代:对各个子树别分行执三步操纵,1.在序前序列中找子树的根节点;2。在中序序列中找子树的根节点,并划开分根节点的阁下子树;3.根据新成生的阁下子树,在序前序列中划开分这些节点,从而失掉了两颗子树的序前、中序序列。

        训练:PAT1043:Is It a Binary Search Tree

        题意:

        入输一个树的序前历遍序列,定判这个树否是是二叉搜索树或者BST的镜像树,如果是,则用后序序列输出。

        解题路思:

        

    • 1.BST很殊特,实质上BST的有所节点的序顺排列就是中序历遍了。
    • 2.要查检树否是是BST或者镜像BST,需只按照重建树的路思,在每次重建的过程当中做恰当查检可即。查检路思是:查检序前历遍序列中,根节点以后的节点序排否是符合BST的二分则规(即前一段都是小于根节点的,后一段都是大于根节点的)。
    • 3.最后的输出是后序历遍。过程当中其实并用不构建个整树,直接在处置过程当中,按后序的方法存储节点到列队中可即。

        有了这些虑考,就可以够写出代码啦。具体解题代码见链接PAT1043

        中序+后序

        法算描述:

        

    • 初始:用后序历遍序列定确根节点,在中序历遍序列中找到该根节点,则阁下子树别分为中序中该节点阁下的序列。
    • 迭代:对各个子树别分行执三步操纵,1.在后序序列中找子树的根节点;2。在中序序列中找子树的根节点,并划开分根节点的阁下子树;3.根据新成生的阁下子树,在后序序列中划开分这些节点,从而失掉了两颗子树的后序、中序序列。
        每日一理道
    我拽着春姑娘的衣裙,春姑娘把我带到了绿色的世界里。

        训练:PAT1020:Tree Traversals

        题意:

        入输为一棵二叉树的后序历遍序列和中序历遍序列。求树的序前历遍序列。

        解题路思:

        

    • 1.有了中序和后序,就可以重建树。
    • 2.最后的输出是序前历遍。过程当中其实并用不构建个整树。直接在处置过程当中,按序前的方法存储节点到列队中可即。

        具体解题代码见链接PAT1020

        中序+层序

        法算描述:

        

    • 初始:用层序历遍定确顶节点,在中序历遍中,利用顶节点分别出阁下子树。
    • 迭代:对各个子树别分行执三步操纵,1.在层序序列中,找出子树节点集合中,最靠前的节点,这个节点即为子树的顶节点;2.在中序序列中找1中失掉的顶节点,并划开分顶节点的阁下子树;
    • 跟(中序+序前)和(中序+后序)不同之处在于没有迭代的第3步,层序是没法直接分别失掉阁下子树的节点集合的。但这不并碍妨常正的处置。层序是用来找到子树的顶节点的,而顶节点等于有所子树的节点中,在层序历遍中最靠前的节点。

        序前+后序

        这个组合是没法重建定确的二叉树的。

        对于满二叉树,利用子树节点的排列序顺能区开分阁下子树节点集合,构建是没有问题的。但一旦有单个叶子的节点存在,则没法定确叶子是左儿子还是右儿子。因为无论是序前还是后序序列,都没法表现单个儿子况情下,儿子的位置。序前会将阁下子树的点置于节点以后,后序则是将阁下子树的点置于节点之前。

        

    • 举个简略的反例:

        给出如下的序前序列和后序序列: preorder: A, B; postorder: B, A

        能构建的二叉树有两种可能,1.A是根节点,B是A左儿子; 2.A是根节点, B是A的右儿子。没法失掉一个独一的结果。

        序前+层序

        这个组合也是没法重建定确的二叉树的。一样于后序+层序的况情。

        理道跟(序前+后序)的理道一样,无论是序前、后序,还是层序,都是没法定确单个儿子节点况情下儿子节点的序顺。

        结总

        

    • 中序历遍配合另外任何一个历遍,能重建二叉树。其他的恣意两个序列的组合都不能独一的定确重建的二叉树。

        


        

    PS:

        

    欢送拜访新博客,这里有更好的排版哦 ; )  点击打开链接

    文章结束给大家分享下程序员的一些笑话语录: 问答
    Q:你是怎么区分一个内向的程序员和一个外向的程序员的? A:外向的程序员会看着你的鞋和你说话时。
    Q:为什么程序员不能区分万圣节和圣诞节? A:这是因为 Oct 31 == Dec 25!(八进制的 31==十进制的 25)

  • 相关阅读:
    Atitit.播放系统规划新版本 v4 q18 and 最近版本回顾
    Atitit.播放系统规划新版本 v4 q18 and 最近版本回顾
    atitit.极光消息推送服务器端开发实现推送  jpush v3. 总结o7p
    atitit.极光消息推送服务器端开发实现推送  jpush v3. 总结o7p
    Atitit.文件搜索工具 attilax 总结
    Atitit.文件搜索工具 attilax 总结
    Atitit.软件命名空间  包的命名统计 及命名表(2000个名称) 方案java package
    Atitit.软件命名空间  包的命名统计 及命名表(2000个名称) 方案java package
    Atitit..状态机与词法分析  通用分词器 分词引擎的设计与实现 attilax总结
    Atitit..状态机与词法分析  通用分词器 分词引擎的设计与实现 attilax总结
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3063646.html
Copyright © 2011-2022 走看看