【数据结构】——树&二叉树&森林之间的联系
一、树与二叉树的联系
这里的树指的是普通的树。
树与二叉树之间的联系建立在一种叫做孩子兄弟法的树的存储方式上面。
这种孩子兄弟法的存储结构和二叉树相同,采用二叉链表。
对于任意一棵树,让每个结点的左指针指向它的第一个孩子结点,右指针指向与它相邻的兄弟结点。这样既能实现整棵树的遍历又能方便的找到任意孩子结点。
下面是将树转换成二叉树的过程:
这种存储方式能够将所有的树转换成二叉树,方便对树的操作,所以这种树的表示方法最普遍也最重要。
二、森林与二叉树的转换
森林是包含 m 棵树的集合(m≥0), 这里表明森林可以为空。
1.森林转二叉树
森林转二叉树其实就是树转二叉树,只是多了一步最后对所有转换后的二叉树的连接。
从上面孩子兄弟法可以看出转换后每棵二叉树的根结点右指针必然为空,依次用每棵树根结点的右指针连接下一棵树的根结点,就能得到一颗完整的二叉树。
过程如图:
2.二叉树转森林
二叉树转森林首先要从根结点一直沿右子树方向寻找,有几个结点就有几棵子树。断开这些结点间的联系就能得到所有这些二叉子树。
最后将每棵二叉子树转换成一般树的形式。
二叉树转森林的过程:
二叉子树转成一般树的步骤:
- 连线——沿父结点左孩子的右孩子方向一直寻找,直到没有结点。并把这条路上的所有结点与父结点相连。
- 删除——将上面路径中所有兄弟结点间的连线删除。
- 调整层次。
过程如下:
三、树的遍历&与二叉树遍历的联系
树因为结点度的不确定性,所以没有中序遍历,只有先根遍历和后根遍历两种。
树的先根遍历:
- 先访问根结点
- 然后依次从左往右先根遍历根结点的每棵子树。
树的后根遍历:
- 先依次从左往右遍历根结点的每棵子树
- 再访问根结点。
例如对上图中步骤3的树,先根遍历为ABEFCDG,后根遍历为EFBCGDA。
可以发现树的先根遍历与转化后的二叉树的先序遍历相同,树的后根遍历与转化后的二叉树的中序遍历相同。
四、森林的遍历&与二叉树遍历的联系
这里《数据结构_C语言_第二版_严蔚敏》书中只提到森林的两种遍历,先序和中序。为什么没有后序有懂得大神可以下方留言。
下面只针对先序和中序。
先序遍历森林:
(1)访问第一棵树的根结点
(2)先序遍历第一棵树根结点的所有子树
(3)先序遍历除第一棵树外剩余的树
中序遍历森林:
(1)中序遍历第一棵树根结点的所有子树
(2)访问第一棵树的根结点
(3)中序遍历除第一棵树外剩余的树
例如对下面图中的森林先序遍历为ABCDEFGHJI,中序遍历为BCDAFEJHIG。
可以看出森林的先序遍历和中序遍历与转化后的二叉树的先序遍历和中序遍历相同。