重学数据结构(六、树和二叉树) (14)


图38:树的双亲表示法示例

在这里插入图片描述


6.1.2、孩子表示法

由于树中每个节点可能有多棵子树, 则可用多重链表, 即每个结点有多个指针域, 其中每个
指针指向一棵子树的根节点,此时链表中的节点可以有如图 39 所示的两种结点节点。


图39:孩子表示法的两种节点

在这里插入图片描述


图 40 (a)所示为图 38 中的树的孩子表示法。 与双亲表示法相反, 孩子表示法便于那些涉及孩子的操作的实现。可以把双亲表示法和孩子表示法结合起来,即将双亲表示和孩子链表合在一起。 图 40(b) 所示的就是这种存储结构的一 例, 它和图 40 (a)表示的是同一棵树。


图40:图 38 的树的另外两种表示法

在这里插入图片描述


6.1.3、孩子兄弟法

又称二叉树表示法,或二叉链表表示法,即以二叉链表做树的存储结构。链表中结点的两个链域分别指向该结点的第一个孩子结点和下一个兄弟结点,分别命名为 firstchild 域和 nextsibling域,其结点形式如图41所示。


图41:孩子兄弟表示法的结点

在这里插入图片描述

图42所示为图40中的树的孩子兄弟链表。利用这种存储结构便于实现各种树的操作。


图42:图38的树的二叉链表表示法

在这里插入图片描述


6.2、树转换为二叉树

在这里我们约定树是有序的,树中每一个节点的儿子结点按从左到右的次序顺序编号。

如图43所示的一棵树,根节点 A有三个儿子 B、 C、 D, 可以认为节点 B为 A的第一个儿子节点, 结点 C 为 A的第二个儿子节点, 节点 D 为 A 的第三个儿子节点。


图43:一般树

在这里插入图片描述

将一棵树转换为二叉树的方法是:

(1) 树中所有相邻兄弟之间加一条连线;

(2) 对树中的每个结点, 只保留它与第一个儿子结点之间的连线, 删去它与其他儿子结点之间的连线。

(3) 以树的根结点为轴心, 将整棵树顺时针转动一定的角度, 使之结构层次分明。

树转换为二叉树的转换过程示意图如下:


图44:树转换为二叉树的过程

在这里插入图片描述


6.3、二叉树还原为树

树转换为二叉树这一转换过程是可逆的, 可以依据二叉树的根结点有无右儿子结点,将一棵二叉树还原为树, 具体方法如下:

(1) 若某结点是其双亲的左儿子, 则把该结点的右儿子、 右儿子的右儿子、 … 都与该结点的双亲结点用线连起来;

(2) 删掉原二叉树中所有的双亲结点与右儿子结点的连线;

(3) 整理由(1)、(2)两步所得到的树, 使之结构层次分明。

二叉树还原为树的过程示意图如下所示:


图45:二叉树还原为树的过程

在这里插入图片描述


6.4、森林转换为二叉树

森林是若干棵树的集合, 森林亦可用二叉树表示。
森林转换为二叉树的方法如下:

(1) 将森林中的每棵树转换成相应的二叉树;

(2) 第一棵二叉树不动, 从第二棵二叉树开始, 依次将后一棵二叉树的根结点作为前一棵二叉树根结点的右孩子, 当所有的二叉树连在一起后, 这样所得到的二叉树就是由森林转换得到的二叉树。

森林及其转换为二叉树的过程如下图所示:


图46:森林及其转换为二叉树的过程

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpxzyd.html