1.1、树的定义
之前提到的数组、单链表、栈、队列这些都是一对一的线性结构,可现实中却有很多一对多的情况需要处理,所以我们需要研究这种一对多的树形结构。树形结构可是比线性结构要复杂、繁琐得多,并且树形结构有非常多的子类结构:二叉树、堆、红黑树、B树、B+树等等。每个子类树在查找、排序、编码压缩、文件管理等等各个方面都展现了优秀的性能优势,这也是为什么要学习树形结构的重要原因。
树( Tree')是 n(n≥0) 个结点的有限集。n=0时无节点,称为空树。
在任意1棵非空树中:
- 有且仅有1个特定的称为根 (Root )的结点。
- n>1 时,其余结点可分为m (m>0) 个互不相变的有限集,其中每一个集合本身又是一槐树,并且称为根的子树( SubTree )。
- n>0 时,树的根结点是唯一的,不可能存在多个根结点,数据结向中的树是只能有一个根结点。
- m>0 时,子树的个数没有限制,但它们一定是不相交的(结点不重复),如下图。
1.2、结点的度
结点拥有的子树数称为结点的度,其实就是看结点往下有多少个分支:一根树枝分出三个树枝,那么度为3。
度为0的结点称为叶子结点或终端结点,因为已经到了树的尽头了,树的每个树枝的尽头是叶子。
度不为0的结点称为树枝结点(分支结点)或非终端结点。
那么一整颗树的度如何衡量?树的度就是取树内所有结点的度中的最大值,所以下图的树的度为3。
1.3、结点间的关系
结点往下每个分支的第一个结点(该结点的子树的根)都称为该结点的孩子结点(Child)。
相应地,该结点称为孩子结点的双亲结点(Parent),对于孩子结点而言,其双亲结点有且只有一个,所以只能称为双亲结点,而不是父亲或母亲结点。
同一个双亲的孩子结点之间称为兄弟结点(Sibling),因为它们的辈分一样。
双亲不同,但双亲之间是兄弟结点的结点之间称为堂兄弟结点,因为它们的辈分一样,双亲的辈分也一样,但双亲不是同一个。D与E或F是堂兄弟结点。
从根结点到任意一个结点所经过分支上的所有结点都称为该结点的祖先结点。所以根节点没有祖先结点,根节点也是其他所有结点的祖先结点;而对于J来说, E、C、A都是J的祖先结点。
反之,一个结点的所有子树中的所有结点都称为该结点的子孙结点(子孙子孙当然包括孩子) 。所以对于根节点而言就是,除它本身以外的所有结点都是它的子孙结点;而对于C来说,E、F、J都是它的子孙结点。
1.4、树的其他概念
我们从图也可以看出树形结构是有层次区分的,树的层次从根开始定义,根为第一层,根的孩子结点为第二层,根的孙子结点为第三层,以此类推。若某结点在第α层,那么该结点的孩子结点则在第α+1层。树的最大层次称为树的深度(Depth)或高度。
如果将树中结点的各子树看成从左至右是有次序的,不能互换的,则称该树为有序树,否则称为无序树。
森林(Forest)是m(m≥0)颗互不相交的树的集合,这个概念很容易理解,对于一颗树的结点而言,该结点的子树集合就是森林。
1.5、树的基本功能
树最重要的功能就是根据要求构造树,其次是树的遍历和结点的插入。