二叉树前序遍历,中序遍历,后序遍历相互求法

这些天,有些做笔试题的朋友问我,关于数据结构二叉树知道前序遍历,中序遍历,求后续遍历的算法,虽然这种也挺简单的,但是在刚大学的时候,刚学数据结构那会儿,我也是不会的……只会在纸上乱涂乱画,唉,当年也是一个渣渣,现在趁有点空,在这总结一下,后边有朋友问到可以直接过来看我的文章就好啦!
我们先来回顾一下二叉树的遍历:

知识点回顾

前序遍历的“前”指的是根节点最前访问,后边中序遍历的“中”指的是根节点中间访问,后序遍历的“后”指的是根节点最后访问。因此,前中后针对的对象是根节点。

前序遍历

  • 根节点

  • 左子树

  • 右子树

中序遍历

  • 左子树

  • 根节点

  • 右子树

后续遍历

  • 左子树

  • 右子树

  • 根节点


现在了解了前中后遍历的一些特点,那么我们来看一个例子吧
已知:
前序遍历: GDAFEMHZ
中序遍历: ADEFGHMZ
求后序遍历
首先,要先画出这棵二叉树,怎么画呢?根据上面说的我们一步一步来……

  1. 先看前序遍历,前序遍历第一个一定是根节点,那么我们可以知道,这棵树的根节点是G,接着,我们看中序遍历中,根节点一定是在中间访问的,那么既然知道了G是根节点,则在中序遍历中找到G的位置,G的左边一定就是这棵树的左子树,G的右边就是这棵树的右子树了。

  2. 我们根据第一步的分析,大致应该知道左子树节点有:ADEF,右子树的节点有:HMZ。同时,这个也分别是左子树和右子树的中序遍历的序列。

  3. 在前序遍历遍历完根节点后,接着执行前序遍历左子树,注意,是前序遍历,什么意思?就是把左子树当成一棵独立的树,执行前序遍历,同样先访问左子树的根,由此可以得到,左子树的根是D,第2步我们已经知道左子树是ADEF了,那么在这一步得到左子树的根是D,请看第4步。

  4. 从第2步得到的中序遍历的节点序列中,找到D,发现D左边只有一个A,说明D的左子树只有一个叶子节点,D的右边呢?我们可以得到D的右子树有EF,再看前序遍历的序列,发现F在前,也就是说,F是先前序遍历访问的,则得到E是F的左子树,只有一个叶子节点。

  5. 到这里,我们可以得到这棵树的根节点和左子树的结构了。如下图:
    根节点和左子树的结构

  6. 接着看右子树,在第2步的右子树中序遍历序列中,右子树是HMZ三个节点,那么先看前序遍历的序列,先出现的是M,那么M就是右子树的根节点,刚好,HZ在M的左右,分别是它的左子树和右子树,因此,右子树的结构就出来了:
    右子树结构

  7. 到这里,我们可以得到整棵树的结构:
    整棵树的结构

结束语

基本上,按照上面说的一步一步来,知道前序遍历和中序遍历求后序遍历就变得非常简单了,今天花点时间记录下来,一方面是做一下知识的回顾,第二点是希望可以帮助到有需要的朋友,现在也是求职高峰期,经常会在笔试题中遇到类似的东西,很多时候都是考到一些平时不怎么注意的细节。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值