已知二叉树的遍历序列去还原二叉树的超好用方法分析

今天记录一下之前学习二叉树时有关由遍历序列求原二叉树的好办法

例:已知二叉树的先序遍历序列是AEFBGCDHIKJ,中序遍历序列是EFAGBCHKIJD,画出此二叉树

我一开始做这些题目的时候也都是得试个几遍,但是后来随着做题数量的慢慢增加,我发现之前的“试几遍”其实是没有参悟二叉树递归的本质,以及各种遍历序列的特点,那么下面我和大家来看看先序遍历序列+中序遍历序列推二叉树的快速方法(一次过把二叉树准确画出来)

我们知道:先序遍历的顺序是 根->左->右;中序遍历的顺序是 左->根->右
所以由先序遍历序列我们可以立刻确定根节点,那么在中序遍历序列中,我们定位这个找出来的根节点,该结点以左就是它的左子树,该结点以右就是它的右子树(这个性质不只是对根节点适用,同时也适用于其他父结点),所以我们利用这样的性质递归地构建好原来的二叉树

好的,我们开始解题吧:
第一步:
下图中第一行的序列是先序序列,第二行是中序序列
《已知二叉树的遍历序列去还原二叉树的超好用方法分析》
我们确定了A就是二叉树的根节点,那么我们再在第二行找到A,A以左(即E,F)就是A的左子树,A以右(即GBCHKIJD)就是A的右子树,然后我们来看看A左子树的情况,由于先序遍历是根左右,所以A完了之后的E一定是左子树的根节点,那么在第二行把E找到,则F必定是它的右子树
好的,整个左子树完成啦,下面看看右边这一大块怎么搞:

《已知二叉树的遍历序列去还原二叉树的超好用方法分析》
由于刚刚我们知道E,F组成了该二叉树的右子树,所以在EF遍历完了之后,先序遍历就应该开始遍历右子树啦,所以B就是右子树的根节点了,同样的在中序遍历序列中定位B,以B为基准划分,我们发现G是B的唯一的左孩子,那么CHKIJD就是B结点的右子树了,看看,问题是不是通过递归的方式慢慢变得简化起来了?
我们继续看看B的右子树怎么搞?
《已知二叉树的遍历序列去还原二叉树的超好用方法分析》
G遍历完,那么先序遍历就应该到了B的右子树了,那么很显然,C即是B右子树的根节点,同样的方法,我们在中序遍历序列中找到C并且划分左右子树,我们发现C没有左子树,如上图的红色线所示HKIJD全部都是C的右子树,很好,那么我们就立刻锁定C右子树的根节点:D,划分,有趣的是,D结点没有右子树,只有左子树,那么现在,我们的问题就变成了找HKIJ的排列方式了

坚持一下,我们已经看到胜利的曙光了!!
《已知二叉树的遍历序列去还原二叉树的超好用方法分析》
那么H就一定是D的左子树的根节点,划分,发现H也只有右子树,那么I必定是H的右子树的根节点,划分,则K为I的左孩子,J为I的右孩子

至此,整个二叉树被我们顺利还原啦!!

但是有一点需要说明一下:如果是已知先序遍历和后序遍历是不能唯一确定一颗二叉树的,但是其他序列的组合是可以的

    原文作者:凝望,划过星空.scut
    原文地址: https://blog.csdn.net/weixin_44586473/article/details/94837044
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞