【数据结构与算法】”先序+后序”能否确定二叉树结构?一个简单的判别法 0. 引入: 二叉树的遍历搜索是对非线性结构的一种线性化操作,经典算法包括先序、中序、后序搜索。假定已知遍历结果,能否确定二叉树结构?以下是教科书中的回答:已知序列能否确定先序+中序一定可以中序+后序一定可以先序+后序不一定为什么先序+后序不一定能推出二叉树?可参考以下例子:
例子在上图(1)(2)中,先序的遍历结果都是AB,后序的遍历结果都是BA,然而对应了两种结构,故无法判定;但当先序序列是ABC,后序序列是BAC时,唯一确定了图(3)。 我们当然可以照着结果序列一步步创建二叉树,再判断原树是否唯一;然而这种做法太过麻烦。有没有一种简单的判别法能够根据先后两个序列,迅速地判断它们能否确定二叉树?笔者想出了以下定理:定理:先、后序列能否确定二叉树结构等价于两个序列是否存在长度为2且顺序相反的公共子串。注:当先序序列出现”
” ,后序序列出现”
“时(紧密相连),一定不能确定二叉树的结构;反之,如果不满足上述条件,则可以确定。 定理的严格证明需要用到以下等价判定引理,然后再证明定理与引理等价。 2. 引理:先、后序列能否确定二叉树结构等价于二叉树是否只有度为0或2的结点。注:也就是说,如果存在度为1的结点,那么就不能确定了。 证明: 遍历(递归法)的代码: 对于一棵二叉树
,我们把其先序遍历结果记为
,后序的记为
。遍历结果序列递归地满足这种顺序。 当二叉树中含有一个度为1的结点(记为
)时,这个结点只有一个孩子结点。我们把这个孩子节点及其延申的子树记为
,它可以是右孩子也可以是左孩子。
子树T0在右
子树T0在左 根据递归代码可知,对于两种树,它们的
中均出现了
,
中也均出现了
;可以归纳地证明,如果没有度为1的结点,不会有上述结果。引理的充分性与必要性证明显然。引理本质上与文章开头提到的“一步步创建再判断”没有区别,因为判断是否存在度为1的结点还是要一步步打草稿,过程依然是繁琐而低效的。 3. 引理与定理等价 证明: 考虑2的如下结论:对于一棵二叉树
,我们把其先序遍历结果记为
,后序的记为
。遍历结果序列递归地满足这种顺序。 (i). 充分性(
): “度为1”
仅有一个孩子结点
结果序列中某个部分缺失了
或
该部分的两种序列变为
与
或
与
,即定理所述情况。 (ii). 必要性(
): 当先序序列出现”
” ,后序序列出现”
“时,结点
必为
的双亲;所以它们所共同存在的子树必然递归地满足
与
的形式。 为了让序列
与
相反,必须删除
或
,也就是出现了度为1的结点。 证毕。 4. 代码实现 5. 一点思考 这是树的定义:树是
个结点的有限集。当
时,称为空树。在任意一棵非空树中应满足:有且仅有一个特定的称为根的结点。当
1″ eeimg=”1″> 时,其余节点可分为
0)” eeimg=”1″> 个互不相交的有限集
,其中每个集合本身又是一棵树,并且称为根的子树。 可以看到其定义是递归的,自然延伸出了许多递归算法;正因如此,在2与3的证明中,我们才把一个结点及其延申又看作了一棵树。 图片来自绘图网站:CS Academy
2024最新激活全家桶教程,稳定运行到2099年,请移步至置顶文章:https://sigusoft.com/99576.html
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。 文章由激活谷谷主-小谷整理,转载请注明出处:https://sigusoft.com/87419.html