算法与数据结构系列之[树-概念]

算法与数据结构系列之[树-概念]
在前面几篇介绍了线性数据结构,那么接下来几篇将会详细介绍下树这种数据结构。有了数组和链表等线性数据结构存储数据已经很方便了,那么为什么还需要树这种数据结构呢?

当然是相较于数组和链表,树具有自己独特的优点,正好能够弥补数组和链表的缺点,我们先看下数组和链表的优缺点,也算是对前面内容的一个总结。

数组通过下标方式访问元素,查询速度快,对于有序数组,还可以利用二分查找法提高检索速度。但是数组在查询某个具体的值,插入或者删除操作时,需要进行数组元素的移动,效率有点低。
链表在一定程度上对数组的储存方式有优化,插入和删除操作,不需要移动元素,性能相对较好,但是链表在查询数据时,需要从头结点开始遍历,效率比较低。

基于以上两种储存结构的缺点,树的优势就凸显出来了。树能够提高数据存储和读取的效率,即可以保证检索的速度,同时又可以保证数据插入,删除,修改的速度,那么树是如何做到这点的呢?接下来,用几篇文章来详细介绍树的相关内容。

这篇先介绍一下树的相关概念。

1.树的定义:树是n(n>=0)个节点的有限集。当n=0时为空树。在一棵非空树中,有且仅有一个根(root)节点。当n>1时,其余节点可分为m(m>0)个互不 相交的有限集,其中每一个集合本身又是一棵树,称之为根的子树(子树之间一定不能相交)。下图满足树的定义:
算法与数据结构系列之[树-概念]
接下来这幅图则不满足树的定义,因为子树之间有相交的节点:
算法与数据结构系列之[树-概念]
2.树的相关概念:
在树中最上面的节点叫做根节点,比如下图中的A节点就是该树的根(root)节点。没有子节点的叫做叶子节点,比如图中的F、G、H、I、K、L都是叶子节点。用来连线相邻节点之间的关系,称为“父子关系”,比如图中的A节点,就是B和J的父节点,B是C,D,E的父节点,J是K和L的父节点,K和L又是J的子节点,而C,D,E这三个节点的父节点是同一个节点B,所以它们之间称为兄弟节点。
算法与数据结构系列之[树-概念]
除此之外,关于树,还有其他几个概念:高度(Height)、深度(Depth)、层(Level):
节点的高度:节点到叶子节点的最长路径(边数)
节点的深度:根节点到这个节点所经历的边的个数
节点的层数:节点的深度+1
树的高度:根节点的高度
树的深度:树中节点的最大层数
下面用画图的方式来举个栗子,说明节点的层数,节点的高度和节点的深度的含义(参考过几本书,对树的高度和深度的定义有所不同,这个大家不必纠结,这些概念也不是特别重要,了解即可):
算法与数据结构系列之[树-概念]
高度是从下往上度量,深度是从上往下度量。

如果将树中节点的各子树看成从左向右是有次序的,不能换序,则称该树为有序树,否则称为无序数。

森林(Forest)是m(m大于等于0)课互不相交的树的集合,对树中每个节点而言,其子树的集合就是森林。
算法与数据结构系列之[树-概念]