树(5.6.2——5.6.3)

5.6.2 森林与二叉树的转换

1.树与二叉树的转换

沿用上一小节所学的树的孩子兄弟表示法,利用二叉链表作为存储结构,导出树与二叉树的对应关系,从而进行树与二叉树之间的转换

PS:每一颗树都对应唯一的一颗二叉树

孩子兄弟表示法:用二叉链表作为树的存储结构,链表的每一个结点结构(一个数据域,两个指针域,左指针存放该结点的孩子结点,右指针存放该结点的兄弟结点)(详情查看线索二叉树笔记)

图形转换方法:(树——>二叉树)
  1. 加线:在兄弟之间加一连线

  2. 抹线:对每个结点,除了其左孩子外,去除其与其余孩子之间的关系

  3. 旋转:以树的根结点为轴心,将整树顺时针转45°(总结:兄弟相连留长子)

    image-20220127143103360
图形转换方法:(二叉树——>树)
  1. 加线:若P结点是双亲结点的左孩子,则将p的右孩子,右孩子的右孩子.....沿分支找到的所有右孩子,都与p的双亲用线连起来
  2. 抹线:抹掉原二叉树中双亲与右孩子之间的连线
  3. 调整:将结点按层次排列,形成树结构(总结:左孩的右孩沿线连双亲,去掉原来右孩线)
image-20220127143745641

2.森林与二叉树的转换

森林——>二叉树(森林里有多颗树)
  1. 将各棵树分别转换成二叉树
  2. 将每棵树的根结点用线相连
  3. 以第一棵树根结点为二叉树的根, 再以根结点为轴心,顺时针旋转,构成二叉树型结构
image-20220127144946406
二叉树——>森林
  1. 抹线:将二叉树中根结点与其右孩子连线,及沿右分支搜索到的所有右孩子间连线全部抹掉,使之变成孤立的二叉树
  2. 还原:将孤立的二叉树还原成树
image-20220127145526306

5.6.3 树和森林的遍历

二叉树的遍历:先序(根左右),中序(左根右),后续(左右根),层次遍历(按深度从小到大,从左到右)

1. 树的遍历

总共有3种遍历方式:先序;后序;层次遍历

PS:为什么没有中序遍历(因为左子树后无法判断根,例上图,先左 B;然后根 A;然后右,右从C开始,C的根为A;重复输出A)

  1. 先根遍历:若树不空,先访问根结点,然后依次先根遍历各课子树
  2. 后根遍历:若树不空,则先依次后根遍历各棵子树,然后访问根结点。
  3. 层次遍历:若树不空,则自上而下自左至右访问树中每个结点。

先根遍历:

image-20220127151117122

2.森林的遍历

将森林看作由三部分构成:

image-20220127151458041
  1. 森林中第一棵树的根结点;
  2. 森林中第一棵树的子树森林;
  3. 森林中其它树构成的森林。
先序遍历(森林不空):
  1. 访问森林中第一棵树的银结点
  2. 先序遍历森林中第一棵树的子树森林;
  3. 先序遍历森林中(除第一棵树之外)其余树构成的森林。(总结:即:依次从左至右对森林中的每一棵树进行先根遍历。)
中序遍历(森林不空):
  1. 中序遍历森林中第一棵树的子树森林;
  2. 访问森林中策一棵树的根结点;
  3. 中序遍历森林中(除第一棵树之外)其余树构成的森林。(总结:即:依次从左至右对森林中的每一棵树进行后根遍历。)
image-20220127152451556
posted @ 2022-01-31 13:16  星繁1  阅读(70)  评论(0)    收藏  举报