树、森林与二叉树的转换
2014-03-05 15:22
211 查看
对于一般树,树中孩子的次序并不重要,只要双亲与孩子的关系正确即可。但在二叉树中,左、右孩子的次序是严格区分的。所以在讨论二叉树与一般树之间 的转换时,为了不引起混淆,约定按树上现有结点次序进行转换。这里研究二叉树与一般树之间的转换,可以了解两者之间的内在本质联系,同时在研究解决一般树 的问题时,有时可以将其转换为二叉树问题来解决。
树或森林与二叉树之间有一个自然的一一对应关系。任何一个森林或一棵树可唯一地对应到一棵二叉树。反之,任何一棵二叉树也能唯一地对应到一个森林或一棵树。
(1)树、森林到二叉树的转换
1)将树转换为二叉树
树中每个结点最多只有一个最左边的孩子(长子)和一个右邻的兄弟。按照这种关系很自然地就能将树转换成相应的二叉树。
将一般树转化为二叉树的思路,主要根据树的孩子-兄弟存储方式而来,步骤是:
①加线:在各兄弟结点之间用虚线相连。可理解为每个结点的兄弟指针指向它的一个兄弟。
②抹线:对每个结点仅保留它与其最左一个孩子的连线,抹去该结点与其他孩子之间的连线。可理解为每个结点仅有一个孩子指针,让它指向自己的长子。
③旋转:把虚线改为实线从水平方向向下旋转45℃,成右斜下方向。原树中实线成左斜下方向。这样就树的形状成呈现出一棵二叉树。
下面图3-54a所示的树可转换为图3-54d所示的二叉树。
注意:由于树根没有兄弟,故树转化为二叉树后,二叉树的根结点的右子树必为空。
2)将一个森林转换为二叉树
森林是树的有限集合,如图3-55a所示。由上节可知,一棵树可以转换为二叉树(没有右子树),一个森林就可以转换为二叉树(没有右子树)的森林。将森林转换为二叉树的一般步骤为:
①将森林中每棵子树转换成相应的二叉树。形成有若干二叉树的森林,如图3-55b所示。
②按森林图形中树的先后次序,依次将后边一棵二叉树作为前边一棵二叉树根结点的右子树,这样整个森林就生成了一棵二叉树,实际上第一棵树的根结点便是生成后的二叉树的根结点。图3-55是将一个森林转化为一棵二叉树的示例。图3-55d是转化后的一棵二叉树。
下图中,图a包含三棵树的森林可转换为图d的二叉树。
(2)二叉树到树、森林的转换
1)二叉树转换为一般树
此时的二叉树必须是由某一树(一般树)转换而来的没有右子树的二叉树。并非随便一棵二叉树都能还原成一般树。
其还原过程也分为三步:
①加线:若某结点i是双亲结点的左孩子,则将该结点i的右孩子以及当且仅当连续地沿着右孩子的右链不断搜索到所有右孩子,都分别与结点i的双亲结点用虚线连接。
②抹线:把原二叉树中所有双亲结点与其右孩子的连线抹去。这里的右孩子实质上是原一般树中结点的兄弟,抹去的连线是兄弟间的关系。
③进行整理:把虚线改为实线,把结点按层次排列。
下图把二叉树还原为一般树:
2)二叉树转换为森林
将一棵二叉树转化成森林,可按如下步骤进行:
①抹线:将二叉树根结点与其右孩子之间的连线,以及沿着此右孩子的右链连续不继搜索到的右孩子间的连线抹掉。这样就得到了若干棵根结点没有右子树的二叉树。
②将得到的这些二叉树用前述方法分别转化成一般树。
树或森林与二叉树之间有一个自然的一一对应关系。任何一个森林或一棵树可唯一地对应到一棵二叉树。反之,任何一棵二叉树也能唯一地对应到一个森林或一棵树。
(1)树、森林到二叉树的转换
1)将树转换为二叉树
树中每个结点最多只有一个最左边的孩子(长子)和一个右邻的兄弟。按照这种关系很自然地就能将树转换成相应的二叉树。
将一般树转化为二叉树的思路,主要根据树的孩子-兄弟存储方式而来,步骤是:
①加线:在各兄弟结点之间用虚线相连。可理解为每个结点的兄弟指针指向它的一个兄弟。
②抹线:对每个结点仅保留它与其最左一个孩子的连线,抹去该结点与其他孩子之间的连线。可理解为每个结点仅有一个孩子指针,让它指向自己的长子。
③旋转:把虚线改为实线从水平方向向下旋转45℃,成右斜下方向。原树中实线成左斜下方向。这样就树的形状成呈现出一棵二叉树。
下面图3-54a所示的树可转换为图3-54d所示的二叉树。
注意:由于树根没有兄弟,故树转化为二叉树后,二叉树的根结点的右子树必为空。
2)将一个森林转换为二叉树
森林是树的有限集合,如图3-55a所示。由上节可知,一棵树可以转换为二叉树(没有右子树),一个森林就可以转换为二叉树(没有右子树)的森林。将森林转换为二叉树的一般步骤为:
①将森林中每棵子树转换成相应的二叉树。形成有若干二叉树的森林,如图3-55b所示。
②按森林图形中树的先后次序,依次将后边一棵二叉树作为前边一棵二叉树根结点的右子树,这样整个森林就生成了一棵二叉树,实际上第一棵树的根结点便是生成后的二叉树的根结点。图3-55是将一个森林转化为一棵二叉树的示例。图3-55d是转化后的一棵二叉树。
下图中,图a包含三棵树的森林可转换为图d的二叉树。
(2)二叉树到树、森林的转换
1)二叉树转换为一般树
此时的二叉树必须是由某一树(一般树)转换而来的没有右子树的二叉树。并非随便一棵二叉树都能还原成一般树。
其还原过程也分为三步:
①加线:若某结点i是双亲结点的左孩子,则将该结点i的右孩子以及当且仅当连续地沿着右孩子的右链不断搜索到所有右孩子,都分别与结点i的双亲结点用虚线连接。
②抹线:把原二叉树中所有双亲结点与其右孩子的连线抹去。这里的右孩子实质上是原一般树中结点的兄弟,抹去的连线是兄弟间的关系。
③进行整理:把虚线改为实线,把结点按层次排列。
下图把二叉树还原为一般树:
2)二叉树转换为森林
将一棵二叉树转化成森林,可按如下步骤进行:
①抹线:将二叉树根结点与其右孩子之间的连线,以及沿着此右孩子的右链连续不继搜索到的右孩子间的连线抹掉。这样就得到了若干棵根结点没有右子树的二叉树。
②将得到的这些二叉树用前述方法分别转化成一般树。
相关文章推荐
- 使用Jquery.load()方法,出现-此页的状态信息无效,可能已损坏。[转]
- topcoder srm 550
- linux expect 安装
- 在web.xml中无法配置<taglib>的问题
- Android中Webview自适应屏幕
- hdu1402 A*B 快速傅里叶变换(FFT)
- WIN7+Ubuntu安装要决
- 基于XMPP协议Android即时通讯开源应用
- linux中sysfs的sys_dirent与kobject的关系
- KMP算法
- (小笔记)(sql)查找重复记录,并删除多余记录
- 菜鸟学JS(三)——自动隐藏的悬浮框
- jquery 小记
- uml的关联多重度
- button 没写 type='button' 导致点击时提交
- JVM调优
- linux删除无效链接文件脚本分享
- Android_ViewPager_实现多个图片水平滚动
- Python 字符串操作(string替换、删除、截取、复制、连接、比较、查找、包含、大小写转换、分割等)
- WebService框架整理(一) Axis1