树、森林与二叉树相互转换

树、森林与二叉树相互转换

本文参考自《大话数据结构》

树转换为二叉树

  1. 加线,在所有兄弟结点之间加一条连线;
  2. 去线。对树中每个结点,只保留它与第一个孩子结点的连线,删除它与其他孩子结点之间的连线;
  3. 层次调整。以树的根结点为轴心,将整棵树顺时针旋转一定的角度,使之结构层次分明。注意第一个孩子是二叉树的左孩子,兄弟转换过来的孩子是结点的右孩子。

树、森林与二叉树相互转换_第1张图片

森林转换为二叉树

森林由若干棵树组成,可以理解为,每一颗树都是兄弟。

  1. 把每棵树转换为二叉树
  2. 第一棵二叉树不动,从第二棵开始,依次把后一棵二叉树的根结点作为前一棵二叉树的根结点的右孩子,用线连接起来。

树、森林与二叉树相互转换_第2张图片

二叉树转换为树

  1. 加线。若某结点的左孩子结点存在,则将这个左孩子的右孩子结点、右孩子的右孩子结点、右孩子的右孩子的右孩子结点…就是左孩子的n哥右孩子结点都作为此结点的孩子。将该结点与这些右孩子结点用线连接起来;
  2. 去线。删除原二叉树中所有结点与其右孩子结点的连线;
  3. 层次调整。使之结构层次分明

树、森林与二叉树相互转换_第3张图片

二叉树转换为森林

判断一棵二叉树能够转换成一棵树还是森林,标准很简单,就是看这棵二叉树的根结点有没有右孩子,有就是森林,没有就是一棵树。

  1. 从根结点开始,若右孩子存在,则把与右孩子结点的连线删除,再查看分离后的二叉树,若右孩子存在,则连线删除…直到所有右孩子连线都删除,得到分离的二叉树;
  2. 再将没棵分离的二叉树转换为树。

树、森林与二叉树相互转换_第4张图片

树与森林的遍历

树的遍历有两种:

  1. 先根遍历树,即先访问树的根结点,然后依次先根遍历根的没棵子树;
  2. 后根遍历,即依次后根遍历没棵子树,然后再访问根结点。

森林的2种遍历方式:

  1. 前序遍历:先访问森林中第一棵树的根结点,然后再依次先根遍历根的每棵子树,再依次用同样方式遍历除去第一棵树的剩余树构成的森林;
  2. 后序遍历:先访问森林中第一棵树,后根遍历的方式遍历没棵子树,然后再访问根结点,再依次同样方式遍历除去第一棵树的剩余树构成的森林。

分析发现,当以二叉链表作为树的存储结构时,树的先根遍历和后根遍历完全可以借用二叉树的前序遍历和中序遍历算法来实现。这也证实了,我们找到了对树和森林这种复杂问题的简单解决方法。

你可能感兴趣的:(数据结构,二叉树)