这里的树并不特指二叉树。
1. 树的存储结构
树有三种常见的表示方法:双亲表示法、孩子表示法、孩子兄弟表示法。
假设我们有这么一棵树:
接下来,我们用三种不同的方式表示它。
(1)双亲表示法
描述:用一组连续空间存储树的节点,每个节点中附加一个指示器,指向父节点所在位置。
对于上面那棵树,我们可以表示为:
评价:这种存储方式很容易获取某个节点父节点,但是获取其子节点就得整个结构遍历一遍。
(2)孩子表示法
描述:用一组连续空间存储树的节点,每个节点中附加一个指针,指向其子节点形成的单链表。
对于上面那棵树,我们可以表示为:
评价:这种存储结构很容易获取某个节点的子节点,但是获取其父节点就得整个结构遍历一遍了。
我们可以结合双亲表示法和孩子表示法,产生如下结果:
(3)孩子兄弟表示法
描述:以二叉链表作为存储结构,链表中节点的两个链域分别指向该节点的第一个孩子节点和下一个兄弟节点。(左孩子,右兄弟)
对于上面那棵树,我们可以表示为:
这种表示方式比较常用。
2. 森林和二叉树的转换
(1)森林可以用二叉树表示
由上面我们已经知道:任何一棵树都可以通过孩子兄弟表示法表示为二叉树。而且要注意到,表示成二叉树的树的根节点的右子树必为空,如果我们把森林中所有树的根节点通过右链域连在一起,那么我们其实也就是用二叉树表示了森林!
看下面例子:
(2)森林与二叉树的转换
森林转换成二叉树
- 先把森林中每棵树转换为二叉树;
- 第一棵二叉树不动,从第二棵二叉树开始,依次把后一棵二叉树的根结点作为前一棵二叉树的根结点的右孩子结点。所有二叉树连接起来后得到的二叉树就是由森林转换得到的二叉树。
二叉树转换为森林
- 先把
(根节点,根节点右孩子节点,根节点右孩子节点的右孩子节点,...)
它们之间链接断开,得到分离的二叉树; - 把分离后的每棵二叉树转换为树;
- 所有转化成的树组成森林。
3. 树和森林的遍历
树的遍历
- 树的先根遍历与其转化成的二叉树的先序遍历一致;
- 树的后根遍历与其转化成的二叉树中序遍历一致。
森林的遍历
- 森林的先序遍历与其转化成的二叉树的先序遍历一致;
- 森林的中序遍历与其转化的二叉树的中序遍历一致。
Ref
http://blog.csdn.net/linraise/article/details/11745559
《数据结构》——严蔚敏