一、前言
我们都知道,任意一棵二叉树的前序序列、中序序列、后序序列都是唯一的。但是,反过来是否唯一对应呢?
- 🍎 先序序列:第一个结点一定是二叉树的根节点;
- 🍎 中序序列:根节点在中序序列中必然将中序序列分割成两个子序列;
- 🍎 后续序列:最后一个结点一定是二叉树的根节点。
这样,只要我们已知先序序列、中序序列,或者后序序列、中序序列,均能唯一的确定一棵二叉树。但是,如果已知任一种序列,无法唯一确定一棵二叉树。为什么呢?
来看上面的二叉树,对于未扩展的二叉树前序序列972165348,我们仅从这个前序序列中无法反演出唯一的二叉树(也就是上面的二叉树),因为我们通过前序序列我们只知道根节点是9,无法区分左右子树,如果再知道中序序列便可以获取到左右子树,从而反演出唯一的二叉树。
(详细分析972165348:9确定是根节点,由上面的性质看出9一定存在左右子树,那么右侧的7一定是左子树根节点,但是2到底是7的左子树,还是7的右子树,或者是9的右子树都有可能,无法唯一确定。)
结论:普通的(未扩展)二叉树前序序列无法反演出唯一的二叉树,通过普通的前序序列和中序序列可以反演出唯一的二叉树。
原因:单独一个普通的二叉树序列,只能获取根节点,或者只能获取左右孩子的信息;而通过前序、中序或者后序、中序搭配可以同时获得根节点和左右孩子的信息。
二、单独一个扩展二叉树序列能否唯一确定二叉树?
如果是扩展二叉树(定义)的序列就另当别论了,参考文献中提到:
扩展二叉树的先序和后序序列都可以唯一确定一颗二叉树,而中序不可以。
1. 实例
如下图所示的二叉树,其扩展二叉树先序序列为972#1##6#53##4##8##,通过该序列可以唯一确定下面的二叉树。(如果不相信,你可以先尝试一下,然后再看后面的解答)
上面扩展二叉树的中序序列为#2#1#7#6#3#5#4#9#8#,而该序列无法唯一确定上面的二叉树,比如下面这个二叉树的扩展二叉树序列同样为#2#1#7#6#3#5#4#9#8#。
至此,我们发现单独一个扩展二叉树的先序序列可以唯一确定这个二叉树,但是单独一个扩展二叉树的中序序列无法唯一确定这个二叉树。为什么呢?请看下面的解释。
2. 原因
由于扩展二叉树的前序序列和后序序列两种情况类似,因此此处我们只讨论扩展二叉树前序序列和扩展二叉树中序序列。
在扩展二叉树的序列中(上面的是未扩展的,自行脑补吧),首先具有这样一个性质:『# 一定没有左右子树,非# 一定有左右子树』。
上述扩展二叉树前序序列是972#1##6#53##4##8##,具体反演过程:9确定是根节点,右侧的7一定是左子树根节点,2一定是7的左子树,因为如果是右子树的话,7后面一定会有#,2后面的#是其左子树,1是2的右子树,##分别是1的左右子树....。
原因:对于扩展的前序序列不仅能够获取到根节点的信息,还能通过#判断出现左子树结束,通过##判断出现右子树结束,因此同样可以唯一确定二叉树。但是扩展的中序序列两个结点之间只有一个#,所以无法唯一确定二叉树。
结论:单独扩展二叉树的先序序列可唯一确定这个二叉树,但是单独扩展二叉树的中序序列无法唯一确定这个二叉树。
(🥝 以上是我根据参考文献的理解,如有错误,欢迎指出,当然如果你觉着写的不错,点赞支持哦。 🥝)
以下为参考文献中的两张图,帮助理解:
三、参考文献
1. 扩展二叉树(#号法)先序和后续可确定二叉树,中序不可_zhanghuaichao的博客-CSDN博客_扩充二叉树
2. 关于中序创建二叉树_阿良7的博客-CSDN博客_中序建立二叉树
3. 中序序列建立二叉树_陪你到天明的博客-CSDN博客_中序建立二叉树
四、加入圈子
🍎欢迎大家加入组织,一起交流、学习,群内多为嵌入式爱好者,也有企业MCU、Linux大佬carry。🍎