树(5.6.2——5.6.3)
目录
5.6.2 森林与二叉树的转换
1.树与二叉树的转换
沿用上一小节所学的树的孩子兄弟表示法,利用二叉链表作为存储结构,导出树与二叉树的对应关系,从而进行树与二叉树之间的转换
PS:每一颗树都对应唯一的一颗二叉树
孩子兄弟表示法:用二叉链表作为树的存储结构,链表的每一个结点结构(一个数据域,两个指针域,左指针存放该结点的孩子结点,右指针存放该结点的兄弟结点)(详情查看线索二叉树笔记)
图形转换方法:(树——>二叉树)
-
加线:在兄弟之间加一连线
-
抹线:对每个结点,除了其左孩子外,去除其与其余孩子之间的关系
-
旋转:以树的根结点为轴心,将整树顺时针转45°(总结:兄弟相连留长子)
图形转换方法:(二叉树——>树)
- 加线:若P结点是双亲结点的左孩子,则将p的右孩子,右孩子的右孩子.....沿分支找到的所有右孩子,都与p的双亲用线连起来
- 抹线:抹掉原二叉树中双亲与右孩子之间的连线
- 调整:将结点按层次排列,形成树结构(总结:左孩的右孩沿线连双亲,去掉原来右孩线)
2.森林与二叉树的转换
森林——>二叉树(森林里有多颗树)
- 将各棵树分别转换成二叉树
- 将每棵树的根结点用线相连
- 以第一棵树根结点为二叉树的根, 再以根结点为轴心,顺时针旋转,构成二叉树型结构
二叉树——>森林
- 抹线:将二叉树中根结点与其右孩子连线,及沿右分支搜索到的所有右孩子间连线全部抹掉,使之变成孤立的二叉树
- 还原:将孤立的二叉树还原成树
5.6.3 树和森林的遍历
二叉树的遍历:先序(根左右),中序(左根右),后续(左右根),层次遍历(按深度从小到大,从左到右)
1. 树的遍历
总共有3种遍历方式:先序;后序;层次遍历;
PS:为什么没有中序遍历(因为左子树后无法判断根,例上图,先左 B;然后根 A;然后右,右从C开始,C的根为A;重复输出A)
- 先根遍历:若树不空,先访问根结点,然后依次先根遍历各课子树
- 后根遍历:若树不空,则先依次后根遍历各棵子树,然后访问根结点。
- 层次遍历:若树不空,则自上而下自左至右访问树中每个结点。
先根遍历:
2.森林的遍历
将森林看作由三部分构成:
- 森林中第一棵树的根结点;
- 森林中第一棵树的子树森林;
- 森林中其它树构成的森林。
先序遍历(森林不空):
- 访问森林中第一棵树的银结点
- 先序遍历森林中第一棵树的子树森林;
- 先序遍历森林中(除第一棵树之外)其余树构成的森林。(总结:即:依次从左至右对森林中的每一棵树进行先根遍历。)
中序遍历(森林不空):
- 中序遍历森林中第一棵树的子树森林;
- 访问森林中策一棵树的根结点;
- 中序遍历森林中(除第一棵树之外)其余树构成的森林。(总结:即:依次从左至右对森林中的每一棵树进行后根遍历。)

浙公网安备 33010602011771号