标题:[二叉树] 二叉树的前中后三序遍历#知二求一
@水墨不写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
故树的结构为:
完~
未经作者同意禁止转载