树、森林与二叉树的转换

前面已经讲过,对于树的定义和存储结构,在满足树的条件下可以是任意形状,一个节点可以有任意多个孩子,故对于树的处理要复杂的多。

二叉树,尽管也是树,但由于每个节点最多只能有左孩子和右孩子,因此很多性质和算法都被研究出来了。若所有树都能像二叉树一样方便就好了,所以才有了相互转换。

在讲到树的储结构时,提到树的孩子兄弟表示法可以将一颗树用二叉链表进行存储。因此,借助二叉链表,树和二叉树可以相互进行转换

树和二叉树的二叉链表存储结构

一般树的二叉链表存储结构


长子地址|节点信息|次弟地址


二叉树的二叉链表存储结构


左子树地址|节点信息|右子数地址


树转换为二叉树的办法

1、树中所有相邻兄弟之间加一条连线
2、对树中每个节点,只保留其与第一个孩子节点之间的连线,删除其与其他孩子节点之间的连线
3、以树的根节点为轴心,将整棵树顺时针旋转一定的角度,使之结构层次分明。

树、森林与二叉树的转换

树中某节点的第一个孩子在二叉树中对应的是相应节点的左孩子,树中某节点的右兄弟节点在二叉树中是相应节点的右孩子。说白了就是:在二叉树中,左分支上的各节点在原来的树中是父子关系,而右分支上的各节点在原来的树中是兄弟关系。由于树的根节点没有兄弟,所以变换后的二叉树的根节点的右孩子必然为空。

森林转换为二叉树

森林是若干树的集合,树可以转换成二叉树,森林也可以转换为二叉树。

基本思想:将森林中所有树的根节点视为兄弟。

PS:虽然树和森林都可以转换为二叉树,但二者有所不同;树转换为二叉树,其根节点必然无右孩子,而森林转换为二叉树,其根节点可以有右孩子。

森林转换为二叉树的办法

1、将森林中的每棵树转换成相应的二叉树。
2、第一颗二叉树不动,从第二棵二叉树开始,依次把后一颗二叉树的根节点作为前一颗二叉树根节点的右孩子,当所有二叉树连在一起后,所得到的二叉树就是由森林转换得到的二叉树。

树、森林与二叉树的转换

二叉树转换为树和森林

树和森林都可以转换为二叉树,二者不同的是:树转换成的二叉树,其根节点无右分支;但是森林转换后的二叉树,其根节点有右分支。显然这个过程是可逆的,即依据二叉树的根节点有无右分支,将一颗二叉树还原成树和森林。
具体办法如下
1、若某节点是其父节点的左孩子,则把该节点的右孩子、右孩子的右孩子、直到最后一个右孩子都与该节点的父节点连起来
2、删除原二叉树中所有所有的父节点与右孩子节点的连线
3、整理1、2步骤中得到的树或森林,使之结构层次分明

树、森林与二叉树的转换

总结

本次对于三者之间的转换的直接原因是:二叉树更加易于研究,树也可以以孩子兄弟表示法(也叫二叉链表法)来表示,在探究的过程中,最重要的就是树在转为二叉树时,其转换后根节点无右节点;而森林在转为二叉树时,其转换后的根节点可以有右节点。