一、课程目标
- 树的定义
- 树的存储
二、目标详解
1、树的定义
树是一种非线性的数据结构,是由n(n>=1)个有限结点组成一个具有层次关系的集合。把它叫做“树”是因为它看起来像一棵倒挂的树,也就是说它是根朝上、叶朝下的。
父子关系
:
- 每个结点(node)有零个或多个子结点(child)
- 每一个非根结点有且只有一个父结点(parent)
- 没有父结点的结点称为根结点(root),有且仅有一个根结点
树与图:图是点和边的集合,树是点和父子关系(边)的集合。
树 <=> n个顶点、n-1条边的连通图。
- 无环
- 连通
子树:
- 每个结点都可以看成一个树,非根结点的树,称为子树。
- 子树互相独立
空树:空集合也是树,称为空树。
2、树的存储
树的核心应用就是遍历访问,出于父子关系的特点,必须要考虑两种访问场景:
- 从父结点出发访问子结点
- 从子结点出发访问父结点
因此为了支持这两种场景(甚至两者都有),就产生了三种基本的(邻接表)存储方式。
- 双亲表示法:每个结点存储双亲的位置,可以快速访问到
- 孩子表示法:每个结点存储它所有孩子的的位置(用链表或动态数组)
- 双亲孩子表示法:每个结点即存储父亲位置,也存储所有孩子的位置
2.1 双亲表示法
每个结点除了自己的信息以外,还存储父亲的位置,方便能从下往上遍历。
方案:
- 如果结点没有信息要存储,就可以用一个数组,下标为结点编号,值为父亲编号。
- 如果结点有其它信息要存储,则可以用一个结构体来存储信息和父亲编号。
根结点没有父亲,因此其存储的父亲位置为空(0或-1)。
优缺点:
- 结点能快速找到其父亲,复杂度为O(1)
- 从结点往上找根结点也比较容易,复杂度为O(logn)
- 从结点找孩子比较麻烦,要循环判定,复杂度为O(n)