序列节点根据前中后序和层序重建二叉树(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)

posted @ 2013-05-06 20:44  坚固66  阅读(312)  评论(0编辑  收藏  举报