树的表示方法

双亲表示法

image.png

孩子表示法

image.png

孩子兄弟表示法

image.png

树/森林转换为二叉树

转换后的二叉树的左右指针的数量关系:

  • 左指针指向的是树/森林的子节点。「二叉树左指针为空的节点数量」等于「树/森林中叶子节点的数量」
  • 右指针指向的是兄弟节点。「二叉树右指针为空的节点数量」等于「树/森林中非叶子节点的数量」加1。(因为:每一个非叶子节点都有子节点,只有其最后一个子节点会贡献一个空的右指针,树的根节点或森林的最右树的根节点也会贡献一个空的右指针)

二叉树 <—> 树

image.png

二叉树 <—> 森林

森林转换为二叉树:

  • 将每棵树都转换为二叉树
  • 树之间是兄弟关系

树-森林 - 图5

二叉树转换为森林:
树-森林 - 图6

遍历

树的「先根遍历」相当于二叉树的「先序遍历」
树的「后根遍历」相当于二叉树的「中序遍历」

森林的「先序遍历」相当于二叉树的「先序遍历」
森林的「中序遍历」相当于二叉树的「中序遍历」

树的遍历

先根遍历:先访问根节点,再访问子节点
后根遍历:先访问子节点,再访问根节点

森林的遍历

「先序遍历」森林

  • 访问森林中第一棵树的根节点
  • 对于第一棵树的子树森林,使用「先序遍历」
  • 对于除第一棵树之外的其他树构成的森林,使用「先序遍历」

「中序遍历」森林:(相当于先子节点,再父节点)

  • 对于第一棵树的子树森林,使用「中序遍历」
  • 访问第一棵树的根节点
  • 对于除了第一棵树之外的其他树构成的森林,使用「中序遍历」

注:为什么这里叫做中序遍历?因为访问根节点的操作被夹在中间,其前后都是递归遍历森林的操作


并查集

将森林中的多棵树合并为一棵树,使用树的双亲表示法比较方便
image.png