先序遍历和后序遍历为什么不能唯一地确定一棵树?
2012-05-28 16:54
246 查看
以前大学学数据结果的时候,我们就知道,根据一棵树的先序遍历和中序遍历,或者后序遍历和中序遍历序列,都可以唯一地确定一棵树。
树中的节点,分为度为0,1,2的结点。如果树中只有一个节点,那么可以唯一确定一棵树,即只有一个节点的树。
当树中结点个数大于等于2的情况,树中的叶子结点和它的父亲结点中,至少有一种存在如下的情况。(为方便起见,我们先从叶子节点入手)
case 1: case2: case 3:
A D F
/ \ / \
B C E G
即,叶子结点的父亲有两个孩子,只有左孩子,只有右孩子的情况。我们只需要证明,如果树存在这三种结构中的哪一种,可以唯一确定一棵树,什么情况下又不能唯一确定一棵树呢?
1. case 1:
A
/ \
B C
前序遍历: ABC, 后序遍历: BCA
现在,我们根据遍历序列,看看能否得到另一种树的结构?
由于在前序遍历中A第一个出现,则A为这棵树的根节点。(前: A BC 后: BC A)
接下来,我们看,BC可以只在A的左子树或者右子树中出现吗?
如果BC只出现在树的左子树或者右子树中,则根据前序遍历, B应为子树的树,C为B的孩子。则后序遍历时,C应在B的前面。但实际的后序遍历,C在B的后面。因此,BC不可能只出现在A的左子树或者右子树当中。因此,在这种情况下,可以唯一确定树的结构。
2. case 2:
D
/
E
前序遍历: DE, 后序遍历: ED
则下面树的结构也满足前序和后序遍历的序列。
D
\
E
即这种情况,不能唯一确定一棵树。
3. case 3:
同case 2情况相似,也不能唯一确定一棵树。
我们可以把叶子结点推广成一棵树的情况,即如果树中只存在度为0和度为2的节点,则根据它的前序遍历和后序遍历序列,可以重构树的结构。否则不能唯一重构树。那如果给你一个前序和后序遍历的序列,我们如何来判断,它是否可以唯一地构造一棵树呢?
即我们根据遍历序列,来看看树中,如果所有结点的度为0或者2,则可以唯一还原。
例: 前序: ABDFGEC 后序: FGDEBCA
第一步: 要结点为A
第二步: 根据前序序列,B为A的左子树的根,根据后序序列 将整个序列分为两部分: FGDEB, C 即A有两个孩子。
第三步: 继续看以B为树的树,前序为 BDFGE, 后序: FGDEB 。 按照分析A的方法来分析 B,最后得知,这棵树可以唯一确定。
但是如果把上面序列中的结点C给去掉,即:前序: ABDFGE 后序: FGDEBA, 此时就不能唯一确定了。
树中的节点,分为度为0,1,2的结点。如果树中只有一个节点,那么可以唯一确定一棵树,即只有一个节点的树。
当树中结点个数大于等于2的情况,树中的叶子结点和它的父亲结点中,至少有一种存在如下的情况。(为方便起见,我们先从叶子节点入手)
case 1: case2: case 3:
A D F
/ \ / \
B C E G
即,叶子结点的父亲有两个孩子,只有左孩子,只有右孩子的情况。我们只需要证明,如果树存在这三种结构中的哪一种,可以唯一确定一棵树,什么情况下又不能唯一确定一棵树呢?
1. case 1:
A
/ \
B C
前序遍历: ABC, 后序遍历: BCA
现在,我们根据遍历序列,看看能否得到另一种树的结构?
由于在前序遍历中A第一个出现,则A为这棵树的根节点。(前: A BC 后: BC A)
接下来,我们看,BC可以只在A的左子树或者右子树中出现吗?
如果BC只出现在树的左子树或者右子树中,则根据前序遍历, B应为子树的树,C为B的孩子。则后序遍历时,C应在B的前面。但实际的后序遍历,C在B的后面。因此,BC不可能只出现在A的左子树或者右子树当中。因此,在这种情况下,可以唯一确定树的结构。
2. case 2:
D
/
E
前序遍历: DE, 后序遍历: ED
则下面树的结构也满足前序和后序遍历的序列。
D
\
E
即这种情况,不能唯一确定一棵树。
3. case 3:
同case 2情况相似,也不能唯一确定一棵树。
我们可以把叶子结点推广成一棵树的情况,即如果树中只存在度为0和度为2的节点,则根据它的前序遍历和后序遍历序列,可以重构树的结构。否则不能唯一重构树。那如果给你一个前序和后序遍历的序列,我们如何来判断,它是否可以唯一地构造一棵树呢?
即我们根据遍历序列,来看看树中,如果所有结点的度为0或者2,则可以唯一还原。
例: 前序: ABDFGEC 后序: FGDEBCA
第一步: 要结点为A
第二步: 根据前序序列,B为A的左子树的根,根据后序序列 将整个序列分为两部分: FGDEB, C 即A有两个孩子。
第三步: 继续看以B为树的树,前序为 BDFGE, 后序: FGDEB 。 按照分析A的方法来分析 B,最后得知,这棵树可以唯一确定。
但是如果把上面序列中的结点C给去掉,即:前序: ABDFGE 后序: FGDEBA, 此时就不能唯一确定了。
相关文章推荐
- 先序遍历和后序遍历为什么不能唯一地确定一棵树?
- 只给出先序遍历和后序遍历不能唯一确定二叉树的例子
- 为什么只给出前序和后序,不能唯一确定一个二叉树
- 为什么只给出前序以及后序遍历,不能生成唯一的二叉树
- java 二叉树的遍历 为什么只给出前序以及后序遍历,不能生成唯一的二叉树
- MySQL 表字段唯一性约束设置方法以及为什么一定要在表中设置字段的唯一约束,而不能在自己的业务代码处理。
- 先序序列和后序序列并不能唯一确定二叉树
- 二叉树 二叉树带虚结点表示的先序遍历可以确定唯一一颗二叉树
- Javascript验证练习。请求师兄修改bug 。出错时候为什么不能显示 “确定”按钮??
- 【转】i++为什么不能作为左值
- 为什么不加WWW的域名能访问,前面加了WWW后不能访问?
- java中静态(static)的方法为什么不能重写(override)
- 为什么Java里的Arrays.asList不能用add和remove方法?
- C语言中变量名为什么不能以数字开头
- 为什么判断UITextField判断为空不能用isEqualToString:@""
- 使用IShellFolder::EnumObjects()不能正确枚举虚目录“我的电脑”下的对象,为什么?
- 为什么不能用iDescription?
- Mac 为什么不能拷贝文件到U盘
- APP中内嵌H5页面为什么不能下载?
- 为什么java中在Thread的run方法中不能throws