树和森林(树、森林与二叉树的转化)

树和森林

    • 树的存储
        • 双亲表示法
        • 孩子表示法
        • 孩子兄弟表示法
    • 树、森林与二叉树的转化
        • 树转化为二叉树
        • 森林转换为二叉树
        • 二叉树转换为森林
    • 树和森林的遍历
        • 树的遍历
        • 森林的遍历
        • 树和森林的遍历与二叉树遍历的对应关系

树的存储

双亲表示法

这种方式利用一组连续的存储空间来存储每一个节点。同时在每一个节点增加一个伪指针,用来记录其双亲节点在数组中的位置。
根结点下标为0,伪指针域为-1。如图:双亲表示法
树和森林(树、森林与二叉树的转化)_第1张图片

孩子表示法

孩子表示法是将每个结点的孩子结点都用单链表链接起来形成一个线性结构。
n个孩子就会有n个孩子链表。
叶子结点的孩子链表为空表。

如下图是孩子表示法:与双亲表示法是同一颗树。
树和森林(树、森林与二叉树的转化)_第2张图片

孩子兄弟表示法

孩子兄弟表示法又称二叉树表示法,即以二叉链表作为存储结构。
每个节点包含三部分内容:结点值,指向结点第一个孩子结点的指针,指向结点下一个兄弟结点的指针(沿此域可以找到结点的所有兄弟结点)。

如下图:与上面表示的都是一棵树
树和森林(树、森林与二叉树的转化)_第3张图片
(左边是第一个孩子结点,右边是兄弟结点)

优点:可以方便地实现树转化为二叉树的操作,易于查找孩子结点等。
缺点:从当前结点查找其双亲结点比较麻烦。
若为每个结点增设一个parent域只想其父结点,则查找父结点也变得很方便。

树、森林与二叉树的转化

树转化为二叉树

转化规则:
“左孩子,右兄弟”
每个结点左指针指向它的第一个孩子,
右指针指向它在树中的相邻的右兄弟。

画法:
1、在兄弟结点之间加一连线
2、对每个结点,只保留它与第一个孩子的连线,与其他孩子的连线全抹掉
3、以树根为轴心,顺时针旋转45度。

树和森林(树、森林与二叉树的转化)_第4张图片

森林转换为二叉树

规则:
与树类似。
先将森林中的每棵树转化为二叉树,每棵二叉树的右子树必空,若把第二棵树根结点是为第一课树根的右兄弟,即将第二棵树对应的二叉树当作第一棵二叉树根的右子树,第三棵树对应的二叉树当作第二棵树对应子树的右子树,以此类推,可以将森林转化为二叉树。

画法:
1、将森林中的每棵树转化为相应的二叉树
2、每棵树的根视为兄弟关系,在每棵树的根之间加一根连线
3、以第一棵树的根为轴心旋转45度
树和森林(树、森林与二叉树的转化)_第5张图片

二叉树转换为森林

规则:
若二叉树非空,则二叉树的根以及左子树为第一棵树的二叉树形式,故将根的右链断开。用同样的方法,知道最后只剩一棵没有右子树的的二叉树为止,将每棵二叉树一次转换成树就得到了原森林。

二叉树转换为树或森林是唯一的。

树和森林的遍历

树的遍历

1、先根遍历
先访问根结点,再一次访问子树
遍历序列与这棵树对应的二叉树的先序序列相同
2、后根遍历
先依次遍历子树,再访问根结点
遍历序列与这棵树对应的二叉树的中序序列相同

森林的遍历

1、先序遍历森林
访问森林中第一棵树的根结点
先序遍历第一棵树中根结点的子树森林
先序遍历出去第一棵树之后剩余的树构成的森林

遍历序列与森林对应的二叉树的先序序列相同
2、中序遍历森林
中序遍历森林中第一棵树的根结点的子树森林
访问第一棵树的根结点
中序遍历出去第一棵树之后剩余的树构成的森林

遍历序列与森林对应的二叉树的中序序列相同

树和森林的遍历与二叉树遍历的对应关系

森林 二叉树
先根遍历 先序遍历 先序遍历
后根遍历 中序遍历 中序遍历

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