二叉树前中后序给定两个确定第三个
一颗二叉树的前序遍历是ABCDFGHE,后序遍历是BGHFDECA,中序遍历是?
https://www.nowcoder.com/questionTerminal/9a60e7b4602a4e69b97c16bf7b5582fb
我们做笔试的时候,经常会遇到这样的题,但是这样的题目不难,而且二叉树的节点一般不多(一般不超过15个),我把分析思路写在下面:
给定中序和前后序中的一个的情况
- 一般情况下,给定中序和前后序中的一个,比如给定中序和前序,中序和后序,我们都可以得到完整的二叉树,由此所有的深度优先遍历都应该是尽在囊中。
主要步骤
比如,此题,我们可以首选根据前序遍历确定根节点为A,然后根据中序遍历可以将其使用A分为两部分,左子树为DCF,右子树为EB,然后我们可以知道{D,C,F}三个节点在同一颗子树上(暂时不考虑顺序),{E,B}三个节点在同一颗子树上,然后我们可以根据前序遍历的特点(总是先遍历父节点),知道C是左子树的根节点,B是右子树的根节点。此时我们可以确定如下部分:
根据中序遍历可知,左子树的中序遍历为DCF,C又是节点,则可以确定左子树的全部结构,如下图。右子树只有两个节点,而B是父节点,C只能是子节点,左节点还是右节点呢?根据中序遍历的结果,发现E在B的前面,根据中序遍历的特点,说明E是左节点。如下图,可得整个二叉树的结构:
然后即可得到后续遍历的结果为:DFCEBA,答案选C。
主要思想:
整体与部分的思想:把每一个子树都当成独立的子树
充分利用给定条件:前序和中序的条件都要反复充分利用
给定后续和中序的情况,也是类似的,留给读者自己探索
给定前序和后序,求中序
如果给定的是前序和后序,我们就不一定能够确定二叉树具体的节点位置了,可能可以唯一确定,也可能无法唯一确定,但是选择题的选项是可以推导出来的。
如下例题:
首先我们分析得到该二叉树的根节点为A,然后分析前序遍历后为B,后续遍历A前位C,B≠C,所以A下两个子节点必然都不为空,并且左节点为B,右节点为C,得到下图:
然后看前序遍历,B和C之前是左子树,C之后是右子树,B和C中间没有元素,所以左子树为B,B的节点均为空。CDFGHE,这些节点均为右子树的节点。然后以C为根节点,把右子树当成完整的一棵树来看待(整体与部分思想)。
然后重复刚才的过程,再看前序遍历C后为D,后续遍历C前为E,D≠E,所以C的两个节点均不为空,且左节点为D,右节点为E,得到如下图:
然后看前序遍历(为什么总看前序遍历,因为前序遍历简单,能给出更多的信息,目的是为了获得更多的辅助信息,如果看别的也能看出来,也可以),D和E中间是D节点下的元素,E后面是E节点下的元素,E后面没有元素了,所以,FGH三个元素都是D节点下的,然后前序遍历中FGH三者的开头是F,所以F是父节点。
但是我们只有前序和后续的结果,缺少中序结果,我们无法判断F是D的左节点还是右节点,两个节点都是对的。
得到如下图:
然后我们看前序遍历的F后面是G,后续遍历的前面是H,H≠G,所以,F的左节点为G,右节点为H,可得如下图:
所以中序遍历的结果有两种,分别是:
- BADGFHCE
- BAGFHDCE
所以,只有C选项符合,是BADGFHCE,所以选C
补充
这种题目还有一个bug,我们可以依靠题目中的前序和选项中的中序,反过来推导题目中的后序,如果能推导出来,那该选项就是答案了。这种做题技巧也是可以掌握的。
给定前序,问哪一种中序是不可能的
还有一种题目是,给定前序,问哪一个中序是不可能的,这样的题目可以采用的一种思路是,一一代入,看哪个不能构成二叉树。一般不能构成二叉树的原因是父节点把两棵子树错误分隔开了,使得前序的结果中的两棵子树的结果产生交叉,从而不合理。
一一代入,就假设给定前序和中序,看能不能形成一个二叉树
A选项,可以形成二叉树,全是右子树,如下图:
B选项,可以形成二叉树,全是左子树,如下图:
C选项, 也可以形成二叉树,如下图:
D选项不可以形成二叉树,请先看下图:
我们首先确定A是根节点,然后B是左子树的根节点,然后根据中序遍历可以得到D单独为一组,CE是一组,是左子树的右子树,那么CE在前序遍历的时候也是挨着的,但是我们看到前序遍历的顺序是CDE,这CE不挨着,因此产生矛盾点,D选项无法组成二叉树,所以选D