树到二叉树的转换就是这么简单
二叉树是树结构的特例,现实生活中见的比较多的是多叉树。由于二叉树的链接浪费率最低,所以我们常常将树转化为二叉树来操作,这样不仅降低链接浪费率,而且还可以使得操作更加简便。
1. 树转化为二叉树
树转化为二叉树的我们通常使用 CHILD-SIBLING(leftmost-child-next-right-sibling)法则,它的执行步骤如下:
- 将树中节点的所有兄弟节点用横线连接起来
- 删除所有与子节点的链接,只保留与最左边子节点的链接
- 顺时针旋转45度
示例: 我们将下图的树转化为二叉树
- 步骤一:将各个兄弟节点连接起来
- 步骤二:删除所有子节点之间的链接,只保留最左边父子节点的链接。
- 步骤三:顺时针旋转45度
二、二叉树转化为树
二叉树转化为多叉树的方法就是树转化为二叉树的逆向步骤,步骤如下:
- 逆时针旋转45度
- 对每一层添加父子之间的链接, 断掉兄弟节点之间的链接
- 调整树的角度
示例: 我们仍以上面的图片为例,将二叉树转化为多叉树。
- 步骤一:逆时针旋转45度
- 对每一层添加父子之间的链接, 断掉兄弟节点之间的链接
- 调整树的角度
三、森林转化为二叉树
如果有好几棵树,那么我们就称其为森林,森林也可以转化为二叉树,转化步骤如下:
- 从左到右将每棵树的树根连接起来
- 按照树转化为二叉树的方法操作
示例: 将下图所示的森林转化为二叉树
-
步骤一:从左到右将所有的根节点连接起来 按照树转二叉树原理进行转化 成功将森林转化为二叉树
四、二叉树转化为森林
既然我们可以将森林转化为二叉树,那么当然也可以将二叉树转化为森林了。其转化方法就是森林转二叉树的倒退,如下所示:
示例: 这次我们找一个稍微复杂点的二叉树,将其转化为森林,如下图所示:
-
首先将原图逆时针旋转45度 断掉兄弟节点关系,为每一层添加父子关系 调整树的角度 转化成功!
五、树 & 森林的遍历
与二叉树的遍历方法一样,树的遍历方法也有前序遍历、中序遍历、后序遍历3中方法,但是方法略微有一些差异。
树的遍历
前序遍历
- 先访问树根Root
- 再以前序遍历法一次遍历Tree1、Tree2…Tree n
中序遍历
- 先以中序遍历法遍历Tree1
- 访问树根Root
- 以中序遍历法依次遍历Tree2、…Tree n
后序遍历
- 以后序遍历法依次遍历Tree1、Tree2…Tree n
- 访问树根Root
森林的遍历
前序遍历
- 如果森林为空,直接返回
- 遍历森林中第一棵树的树根
- 按前序遍历第一棵树的子树群
- 按前序遍历森林中其他树
中序遍历
- 如果森林为空,直接返回
- 以中序遍历第一棵树的子树群
- 中序遍历森林中第一棵树的的树根
- 以中序法遍历森林中的其他树
后序遍历
- 如果森林为空,直接返回
- 按后序遍历森林中第一棵树的子树群
- 按后序法遍历森林中的其他树
- 遍历森林中的第一棵树的树根
示例: 遍历如下森林 前序遍历:ABECDFGHI 中序遍历:EBCDAGHFI 后序遍历:EBCDGHIFA
六、唯一二叉树
如果我们知道二叉树的中序与前序遍历结果或者中序与后序遍历结果,我们可以根据这些结果求得唯一二叉树,但是如果只是知道前序与后序遍历结果,则无法唯一确定二叉树。
上面就是树、森林、二叉树之间的关系了,图画的比较丑,大家不要介意哈…