真实生活中的的树大家都见过,也非常熟悉。而数据结构中的树结构,跟我们真实的树非常类似,有主干,支干,叶子。下面是某公司的组织架构图:
这就是一个很典型的树状图,总经理类似树的主干,他的子部门类似树的支干,其他部门类似树的叶子,这样就构成了一个树结构的架构图。
我们将里面的数据移除,仅仅抽象出来结构,那么就是我们要学的树结构。
树的优点
我们前面学习了很多数据结构,有数组/链表/哈希表,那么为什么要用树结构来保存数据呢?它有什么优点呢?我们来一一分析一下:
数组
- 优点:根据下标值访问数据效率很高
- 缺点:数组在插入或者删除的情况下,有大量数据位移操作,效率很低
链表
- 优点:链表的插入和删除数据的效率都很高
- 缺点:查找效率很低,需要从头开始查找,依次遍历每个数据项,直到找到为止。而且即使是插入和删除的效率很高,但是如果要从中间操作数据,还是得从头开始查找数据。
哈希表
- 优点:哈希表的查找/插入/删除效率都很高
- 缺点:空间利用率不高,底层使用的是数组,某些单元并没有被利用。无法快速找出哈希表中类似极值的这种特殊值。
树结构
终于来到将要学习的树结构了,树结构的优点其实就是弥补了以上数据结构的缺点,而且综合了以上数据结构的优点(听起来是完美的数据结构),但是我们并不能说树结构比其他数据结构都要好,因为每种数据结构都有特定的使用场景,在特定的使用场景下才能说最好的数据结构是xxx。就像JavaScript啥都能做,但是你能说JavaScript是世界上最好的语言吗(手动狗头,我觉得是)?
树的术语
为了让我们更加理解树结构,需要知道一些树的术语。
树(Tree):n(n>=0)个节点构成的有限集合。
- 当n=0时,我们称此时的树为空树 那么对于一颗非空树,它拥有以下性质:
- 它的根节点(Root)我们用r表示
- 其余的节点可分为m(m>0)个互不相交的有限集T1,T2,... ,Tm,其中每个集合本身又是一棵树,称为原来数的子树(SubTree)
- 节点的度(Degree):节点的子树个数,下图A节点的度为2
- 树的度:所有节点中最大的度数,下图树的度为2
- 叶节点(Leaf):度为0的节点
- 父节点(Parent):如下图B是D和E节点的父节点
- 子节点(Child):如下图D和E节点是B的子节点
- 兄弟节点(Sibling):如下图D和E互为兄弟节点
- 路径和路径的长度:如下图A到H就是一条路径,路径的长度为之间所连成的线的个数,为3。
- 节点的层次(Level):规定根节点在1层,其他任一节点的层数是其父节点的层数加1。
- 树的深度(Deep):树节点的最大层次。