数据结构之树和森林
- 1、树的存储结构
- 2、树和森林的遍历
- 2.1、树的遍历
- 2.2、森林的遍历
- 3、树、森林和二叉树之间的相互转换
数据结构是程序设计的重要基础,它所讨论的内容和技术对从事软件项目的开发有重要作用。学习数据结构要达到的目标是学会从问题出发,分析和研究计算机加工的数据的特性,以便为应用所涉及的数据选择适当的逻辑结构、存储结构及其相应的操作方法,为提高利用计算机解决问题的效率服务。
数据结构是指数据元素的集合及元素间的相互关系和构造方法。元素之间的相互关系是数据的 逻辑结构,数据元素及元素之间关系的存储称为 存储结构(或物理结构)。数据结构按照逻辑关系的不同分为 线性结构和 非线性结构两大类,其中,非线性结构又可分为树结构和图结构。
树结构是一种非常重要的非线性结构,该结构中的一个数据元素可以有两个或两个以上的直接后继元素,树可以用来描述客观世界中广泛存在的层次结构关系。
1、树的存储结构
常用的树的存储有双亲表示法、孩子表示法和孩子兄弟表示法。
(1)双亲表示法。该表示法用一组地址连续的单元存储树的结点,并在每个结点中附设一个指示器,指出其双亲结点在该存储结构中的位置(即结点所在数组元素的下标)。显然,这种表示法对于求指定结点的双亲和祖先都十分方便,但对于求指定结点的孩子及后代则需要遍历整个数组,树的双亲表示法如下图所示。
(2)孩子表示法。该表示法在存储结构中用指针指示出结点的每个孩子,为树中每个结点的孩子建立一个链表,即令每个结点的所有孩子结点构成一个用单链表表示的线性表,则n个结点的树具有 n 个单链表。将这 n 个单链表的头指针又排成一个线性表,如下图(a) 所示。显然,树的孩子表示法便于查找每个结点的子孙,若要找出指定结点的双亲则可能需要遍历所有的链表。
用户也可以将双亲表示法和孩子表示法结合起来,形成树的双亲孩子表示结构,如上图(b) 所示。
(3)孩子兄弟表示法。孩子兄弟表示法又称为二叉链表表示法,它在链表的结点中设置两个指针域分别指向该结点的第一个孩子和下一个兄弟,如下图 所示。
树的孩子兄弟表示法为实现树、森林与二叉树之间的转换提供了可能,充分利用二叉树的有关算法来实现树及森林的操作,对难以把握规律的树和森林有着重要的现实意义。
2、树和森林的遍历
2.1、树的遍历
由于树中的每个结点可以有多个子树,因此遍历树的方法有两种,即先根遍历和后根遍历。
(1)树的先根遍历。树的先根遍历是先访问树的根结点,然后依次先根遍历根的各棵子树。对树的先根遍历等同于对转换所得的二叉树进行先序遍历。
(2)树的后根遍历。树的后根遍历是先依次后根遍历树根的各棵子树,然后访问树根结点。树的后根遍历等同于对转换所得的二叉树进行中序遍历。
2.2、森林的遍历
按照森林和树的相互递归定义,可以得出森林的两种遍历方法。
(1)先序遍历森林。若森林非空,首先访问森林中第一棵树的根结点,然后先序遍历第一棵树根结点的子树森林,最后先序遍历除第一棵树之外剩余的树所构成的森林。
(2)中序遍历森林。若森林非空,首先中序遍历森林中第一棵树的子树森林,然后访问第一棵树的根结点,最后中序遍历除第一棵树之外剩余的树所构成的森林。
3、树、森林和二叉树之间的相互转换
树、森林和二叉树之间可以互相进行转换,即任何一个森林或一棵树可以对应表示为一棵二叉树,而任何一棵二叉树也能对应到一个森林或一棵树上。
(1)树、森林转换为二叉树。利用树的孩子兄弟表示法可导出树与二叉树的对应关系,在树的孩子兄弟表示法中,从物理结构上看与二叉树的二叉链表表示法相同,因此就可以用这种同一存储结构的不同解释将一棵树转换为一棵二叉树,如下图 所示。一棵树可转换成唯一的一棵二叉树。
由于树根没有兄弟,所以树转换为二叉树后,二叉树的根一定没有右子树。这样,将一个森林转换为一棵二叉树的方法是: 先将森林中的每一棵树转换为二叉树,再将第一棵树的根作为转换后的二叉树的根,第一棵树的左子树作为转换后二叉树根的左子树,第二棵树作为转换后二叉树的右子树,第三棵树作为转换后二叉树根的右子树的右子树,依此类推,森林就可以转换为一棵二叉树,如下图所示。
(2)二叉树转换为树和森林。一棵二叉树可转换为唯一的树或森林,如下图所示