树、森林和二叉树之间的转换
计算机程序设计中,数据结构是非常重要的一环,它是对计算机内存、数据等内容的一种规划与安排,它对程序的可读性,扩展性以及是否健壮等方面有很大帮助。
在数据结构中数组的搜索相对比较方便,通过下标直接可以进行选择,但删除或者插入某些元素就会比较麻烦。 链表与数组正好相反,它在删除和插入数据操作中很快,但是查找却比较慢。
二叉树就既有链表的好处,也有数组的好处,在处理大批量的动态的数据是比较有用,所以一般会将一些无序树、森林等转换为二叉树进行数据处理相对比较方便。
一、树转换为二叉树
转换方法:
- 加线:将所有兄弟结点用一条线连接起来;
- 去线:对树中的每个结点,只保留该结点与其第一个左孩子结点之间的连线,删除它与其它孩子结点之间的连线;
- 层次调整:以树的每根节点为轴心,将整棵树顺时针旋转一定角度,使之结构层次分明。(注意第一个孩子是结点的左孩子,兄弟转换过来的孩子是结点的右孩子)
![](https://img-blog.csdnimg.cn/20200924201618507.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_RWRkeV9Gb3I=,size_20,color_FF0000,t_70)
![](https://img-blog.csdnimg.cn/20200924201735718.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_RWRkeV9Gb3I=,size_20,color_FF0000,t_70)
![](https://img-blog.csdnimg.cn/20200924201952372.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_RWRkeV9Gb3I=,size_20,color_FF0000,t_70)
![](https://img-blog.csdnimg.cn/20200924202112601.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_RWRkeV9Gb3I=,size_20,color_FF0000,t_70)
转换方法:
- 转换:把每一棵树单独转换成二叉树;
- 连线:保持第一棵二叉树不变,从第二棵二叉树开始,依次将后一棵二叉树的根节点作为前一棵二叉树根节点的右孩子,用线连起来;
三、二叉树转换为树
二叉树转换为树可看作树转换为二叉树的逆过程。
转换方法:
- 加线:当某结点的左孩子结点存在,则将这个左孩子的n个右孩子结点都作为此结点的孩子。将该结点与这些右孩子结点用线连接起来;
- 去线:删除二叉树中所有结点与其右孩子之间的连线;
- 层次调整:整理(1)和(2)两步得到的树,使之结构层次分明。
四、二叉树转换为森林
判断一棵二叉树能够转换成一棵树还是森林,首先需要看这棵二叉树的根结点有没有右孩子,有就可转为森林,没有就是一棵树。
转换方法:
- 去线:从二叉树根结点开始,若其右孩子结点存在,则把与右孩子结点的连线删除,再查看分离后的二叉树,若右孩子存在,则连线删除……,直到所有右孩子连线都删除为止,得到分离的二叉树。;
- 转换:将分离的二叉树转换成树
🤨
O.O
🙃