树、森林与二叉树的相互转换
树转换为二叉树
二叉树和树都可以用二叉链表作为存储结构,因此二叉链表可以导出树与二叉树的一个对应关系,即给定一棵树,可以找到唯一的一棵二叉树与之对应。其中树的二叉链表存储详情可参照。
树转换成二叉树的规则: <1>每个结点的左指针指向它的第一个孩子结点; <2>每个结点的右指针指向它在树中的相邻兄弟结点。 可表示为“左孩子右兄弟”。 注意:由于根结点没有兄弟,故由树转换而得的二叉树没有右子树。
关于树转换为二叉树的实例及过程如下所示: 首先给出要转换为二叉树的树:
<1> 在所有兄弟间画线,所谓兄弟即拥有相同父结点的所有结点。如红线所示。
<2> 去掉每个结点除了第一个孩子结点外的其他线,即只保留第一个孩子结点。如虚线所示。
<3> 最后旋转45°。去掉虚线,黑实线为左孩子,红色实线为右孩子,调整为二叉树的形状。
故该树对应的二叉树为:
森林转换为二叉树
森林转换为二叉树的规则与树类似: <1> 将森林中的每棵树转换为二叉树; <2> 将第一棵树的根作为转换后的二叉树的根,将第一棵树的左子树作为转换后二叉树根的左子树; <3> 将第二棵树作为转换后二叉树的右子树; <4> 将第三棵树作为转换后二叉树根的右子树的右子树; 以此类推,就可将森林转换为二叉树。
其过程不难理解,由树转换为的二叉树没有右子树,而森林转换为二叉树就是将每棵树转换成的二叉树依次作为右子树加在当前的二叉树上,直至形成一棵完整的二叉树。
关于森林转换为二叉树的实例及过程如下所示: 首先给出要转换成二叉树的森林:
<1> 将森林中的每棵树转换为二叉树。具体操作参照上一部分:树转换为二叉树。
<2> 将每棵树的根相连。
<3> 以第一棵树的根为轴心顺时针旋转45°。
二叉树转换为森林
二叉树转换为森林的规则: <1> 若二叉树非空,则二叉树的根及其左子树作为第一棵树的二叉树形式; <2> 二叉树根的右子树视作除第一棵树外的森林转换后的二叉树; 重复上面的操作,直到产生一个没有右子树的二叉树为止。 然后将每个二叉树转换为其对应的树,就得到了所要求的森林。
将二叉树转换为森林的实例及过程如下所示: 首先给出需要转换的二叉树:
<1> 分离出森林中每棵树的二叉树形式。我们知道树向二叉树转换时,都会形成一个没有右子树的二叉树,而森林则是将每棵树的对应的二叉树安插在右子树上,故分离时只需要沿当前二叉树的根结点出发,依次摘下其右子树即可。
即分出了下图所示的三棵二叉树:
<2> 按照将树转为二叉树时的左孩子右兄弟原则,将每棵二叉树转换为对应的树,具体操作为:对于一个二叉树,其左孩子结点为原树的第一个孩子结点,右孩子结点则是原树该结点的兄弟结点,应将其调整至同一父结点下。最终便能得到所要求的原森林。