[二叉树] 二叉树的前中后三序遍历#知二求一

标题:[二叉树] 二叉树的前中后三序遍历#知二求一

@水墨不写bug

(图片来源于网络) 


 正文开始:

        其实这一类题就是考察对二叉树的结构理解,此类题目的二叉树一般通过数组传入,我们只需根据二叉树的就够特点对数组进行分区即可,其实这也是一个看递归的一个全新的视角,即将数组递归的分为 “根” “左区间” “右区间”,这一过程生动诠释了递归的特色。

        对于传入的数组,将其分为根,左区间,右区间。其中,左区间代表左子树,右区间代表右子树。

从整体上来说:

前序遍历分为:根——左区间——右区间;(根——左区间——右区间)

中序遍历分为:左区间——根——右区间;(左子树——根——右子树)

后序遍历分为:左区间——右区间——根;(左子树——右子树——根)

(一)知前序中序求后序(前+中->后)

        (1)已知某二叉树的前序遍历序列为5 7 4 9 6 2 1,中序遍历序列为4 7 5 6 9 1 2,则其后序遍历序列为( )

思路:

抓住前序三序遍历的特点:

        前序遍历的首元素就是二叉树的根;

        中序遍历的根的左右区间分别就是左子树和右子树;

        后序遍历的最后一个元素就是二叉树的根;

总结:

        前序和后序是用来获得根的,中序是用来根据根的相对位置来分别区分出左右区间(左右字数的);

 

接下来再通过解决例题(1)来验证一下结论:

        通过前序遍历找到子树的根,在中序遍历中找到根的位置,然后确定根左右子树的区间,即根的左侧为左子树中所有节点,根的右侧为右子树中所有节点。

故:根为: 5

        5的左子树:4 7   5的右子树: 6 9  1  2

        5的左子树的根为: 7  5的右子树的根为:9

        7的左子树: 4 7的右:空  9的左子树:6  9的右子树:2

故这棵树的结构为:

(二)知前序后序求中序(前+后->中)

        仅通过二叉树的前序遍历和后序遍历,我们不能唯一地确定一个二叉树的中序遍历结果,因为存在多种可能的二叉树结构满足相同的前序和后序遍历结果。

        前序遍历的顺序是:根节点 -> 左子树 -> 右子树
        后序遍历的顺序是:左子树 -> 右子树 -> 根节点

        但是,没有中序遍历(左子树 -> 根节点 -> 右子树)的信息,我们就无法准确地知道左子树和右子树各包含哪些节点,特别是当节点值可以重复时。

        然而,如果我们知道二叉树是满二叉树(每个节点都有两个子节点)或者是完全二叉树(除最后一层外,其他层都是满的,并且最后一层的节点都靠左排列),并且节点值不重复,那么在某些特定情况下,我们可能可以推断出中序遍历的结果。但这不是一般情况下的解决方案。

        对于一般情况,如果我们需要从前序和后序遍历中恢复二叉树(或中序遍历),我们需要额外的信息或使用更复杂的算法,如基于树的重建算法,但这通常涉及到递归的猜测和验证过程,且不一定总是可行的。

        所以,简单地说,仅通过前序和后序遍历,我们不能直接求出中序遍历的结果。

如果你对这一结论感兴趣,可以参考这篇文章来深入探究:

【数据结构与算法】"先序+后序"能否确定二叉树结构?一个简单的判别法 - 知乎 (zhihu.com)

(三)知中序后序求前序(中+后->前)

        已知某二叉树的中序遍历序列为JGDHKBAELIMCF,后序遍历序列为JGKHDBLMIEFCA,则其前序遍历序列为( )

        由后序遍历确定子树的根,后序遍历从后向前看,最后一个元素为根,和前序遍历刚好相反,从后向前看后序遍历,应该是根,右,左,根据中序遍历确定子树的左右区间

故:根为: A

        A的左子树:JGDHKB       A的右子树:ELIMCF

        A的左子树的根:B            A的右子树的根:C

        B的左子树:JGDHK  B的右子树:空  C的左子树:ELIM C的右子树:F

        B的左子树的根:D         C的左子树根:E

        D的左子树的根:G   D的右子树的根:H       E的右子树的根:I

故树的结构为:

 


完~

未经作者同意禁止转载 

  • 37
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 23
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 23
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

水墨不写bug

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值