• 根据二叉树的后序遍历以及中序遍历还原二叉树


    根据二叉树的后序遍历以及中序遍历还原二叉树


    【题目】
    假设一棵二叉树的后序遍历序列为 DGJHEBIFCA ,中序遍历序列为 DBGEHJACIF ,则其前序
    遍历序列为 ( ) 。
    A. ABCDEFGHIJ
    B. ABDEGHJCFI
    C. ABDEGHJFIC
    D. ABDEGJHCFI




    由题,后序遍历的最后一个值为A,说明本二叉树以节点A为根节点(当然,答案中第一个节点都是A,也证明了这一点)


    下面给出整个分析过程
    【第一步】
    由后序遍历的最后一个节点可知本树根节点为【A】
    加上中序遍历的结果,得知以【A】为根节点时,中序遍历结果被【A】分为两部分【DBGEHJ】【A】【CIF】
    于是作出第一幅图如下


    【第二步】
    将已经确定了的节点从后序遍历结果中分割出去
    即【DGJHEBIFC】---【A】
    此时,位于后序遍历结果中的最后一个值为【C】
    说明节点【C】是某棵子树的根节点
    又由于【第一步】中【C】处于右子树,因此得到,【C】是右子树的根节点
    于是回到中序遍历结果【DBGEHJ】【A】【CIF】中来,在【CIF】中,由于【C】是根节点,所以【IF】都是这棵子树的右子树,【CIF】子树没有左子树,于是得到下图


    【第三步】
    将已经确定了的节点从后序遍历中分割出去
    即【DGJHEBIF】---【CA】
    此时,位于后序遍历结果中的最后一个值为【F】
    说明节点【F】是某棵子树的根节点
    又由于【第二步】中【F】处于右子树,因此得到,【F】是该右子树的根节点
    于是回到中序遍历结果【DBGEHJ】【A】【C】【IF】中来,在【IF】中,由于【F】是根节点,所以【I】是【IF】这棵子树的左子树,于是得到下图



    【第四步】
    将已经确定了的节点从后序遍历中分割出去
    即【DGJHEB】---【IFCA】
    此时,位于后序遍历结果中的最后一个值为【B】
    说明节点【B】是某棵子树的根节点
    又由于【第一步】中【B】处于【A】的左子树,因此得到,【B】是该左子树的根节点
    于是回到中序遍历结果【DBGEHJ】【A】【C】【F】【I】中来,根据【B】为根节点,可以将中序遍历再次划分为【D】【B】【GEHJ】【A】【C】【F】【I】,于是得到下图




    【第五步】
    将已经确定了的节点从后序遍历中分割出去
    即【DGJHE】---【BIFCA】
    此时,位于后序遍历结果中的最后一个值为【E】
    说明节点【E】是某棵子树的根节点
    又由于【第四步】中【E】处于【B】的右子树,因此得到,【E】是该右子树的根节点
    于是回到中序遍历结果【D】【B】【GEHJ】【A】【C】【F】【I】中来,根据【B】为根节点,可以将中序遍历再次划分为【D】【B】【G】【E】【HJ】【A】【C】【F】【I】,于是得到下图


    【第六步】
    将已经确定了的节点从后序遍历中分割出去
    即【DGJH】---【EBIFCA】
    此时,位于后序遍历结果中的最后一个值为【H】
    说明节点【H】是某棵子树的根节点
    又由于【第五步】中【H】处于【E】的右子树,因此得到,【H】是该右子树的根节点
    于是回到中序遍历结果【D】【B】【G】【E】【HJ】【A】【C】【F】【I】中来,根据【H】为根节点,可以将中序遍历再次划分为【D】【B】【G】【E】【H】【J】【A】【C】【F】【I】,于是得到下图



    至此,整棵二叉树已经还原
    现在对该二叉树进行前序遍历便能得到我们想要的答案
    【B】

  • 相关阅读:
    优化SQL Server数据库的经验总结
    #main和.main区别
    通过SQL把n条记录插入表中
    11月6日到8日参加微软Tech.ED2008大会
    NOIP2017 D2T1奶酪
    NOIP2017 D1T2时间复杂度
    NOIP2017 D2T2宝藏
    NOIP2017 D1T1小凯的疑惑
    NOIP2017 D1T3逛公园
    NOIP2017 D2T3列队
  • 原文地址:https://www.cnblogs.com/skyofbitbit/p/2677489.html
Copyright © 2020-2023  润新知