树(Tree)相关知识

1、树的定义

树(Tree)是n(n≥0)个节点的有限集合。n=0时称为空树。在任意一颗非空树中:
(1)有且仅有一个特定的称为根(Root)的节点;(2)当n>1时,其余节点可分为m(m>0)个互不相交的有限集T1、T2、……、Tm,其中每一个集合本身又是一颗树,并且称为根的子树(subTree)。如下图所示:


树(Tree)相关知识_第1张图片

下图是根节点A的两颗子树T1和T2,B、D、E、F组成的子树以B为根节点,C、G、H组成的子树以C为根节点。如下图:

树(Tree)相关知识_第2张图片

      在一颗树中,n>0时根节点是唯一的,一颗书中不可能存在多个根节点。子节点m>0时,子树的个数没有限制,但是子树一定不能够相交。


2、度(Degree)

     树的节点包含一个数据元素及若干个指向其他节点的分支。节点拥有子树的个数称为节点的度(Degree)。度为0的节点称为叶子节点(leaf);度不为0的节点称为非叶子节点。树的度是树内各节点度的最大值。


树(Tree)相关知识_第3张图片

     如上图,这颗树中度最大的节点是B,度为3,所以这颗树的度也为3。

3、深度(Depth)

节点的层次(Level)从根节点开始算起,根节点所在的层次为第一层,以此类推。树中结点的最大层次称为树的深度(Depth)或者高度。如下图:


树(Tree)相关知识_第4张图片

    如上图,当前树的深度是4。

4、树的存储结构

4.1、父节点表示法

     使用父节点表示法时,每个节点包含自身的数据和指向父节点的指针。针对上面示例中的树,存储结构如下图所示:


树(Tree)相关知识_第5张图片

     节点A为根节点,则A的父节点指针标记为-1;B、C是根节点A的子节点,则B、C的父节点指针指向A。依次类推,得出上图的存储结构。既可以通过顺序存储结构将所有的节点保存在一个顺序数组中,也可以使用链表的形式进行保存。
     通过观察发现,此种存储结构可以根据节点中存储的指针快速的找到父节点,但想知道某个节点的所有子节点,则需要遍历整个树结构。

4.2、子节点表示法

     使用子节点表示法时,每个节点包含自身的数据和指向每个子节点的指针,由于每个节点包含的子节点个数可能不同,因此每个节点包含的指针个数也可能不同,每个节点的度表示每个节点子节点的个数,所以每个节点包含的指针个数与节点的度相同。存储结构如下:


树(Tree)相关知识_第6张图片

     针对上面的示例的树,使用子节点表示法如下图所示:

树(Tree)相关知识_第7张图片

     以上的表示方法,各个节点的指针个数不同,导致链表都是不同的结构,在运算过程中会带来很大不便。

     另一种表示方法是:把每个节点排列起来,n个节点以顺序存储结构保存起来,每个节点保存一个子链表,记录节点的子节点,最后一个节点的指针域指向null。如下图所示:


树(Tree)相关知识_第8张图片

使用这种表示方法,需要定义两个数据结构,一种是顺序数组的结构、一种是链表节点的数据结构。


小结:存储结构的设计是一个非常灵活的过程,需要根据实际的业务场景进行设计。存储结构设计的是否合理,取决于该存储结构的操作是否方面、时间和空间效率是否高效等方面因素。

你可能感兴趣的:(数据结构和算法)