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)

  • 相关阅读:
    VS2010+C#写的3D的Android游戏开源咯....不来看别后悔哦。
    把XAML放在服务端,即改即现.....
    TagSL框架设计(1)先来点简介
    OpenMP模式下多线程文件操作 (转)
    VS获取工程版本信息
    OpenMP模式下多线程文件操作(五)
    简单建立DLL和使用DLL
    OpenMP模式下多线程文件操作(三)
    OpenMP模式下多线程文件操作(四)
    【转】VC2008在工具栏Toolbar里添加XP风格spin box control控件
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3063646.html
Copyright © 2011-2022 走看看