一 概述
树是n(n>=0)个结点的有限集。当n=0时,称为空树。在任意一棵非空树中应满足:
- 有且仅有一个特定的称为根的结点。
- 当n>1时,其余结点可分为m(m>0)个互不相交的有限集T1,T2,T3...,Tm,其中每个结点本身又是一棵树,并且称为根的子树。
显然,树的定义是递归的,即在树的定义中使用了自身,树是一种递归的数据结构。树作为一种逻辑结构,同时也是一种分层结构,具有以下两个特点:
- 树的根结点没有前驱,除根结点外的所有结点有且只有一个前驱。
- 树中的所有结点可以有零个或多个后继。
树适合于表示具有层次结构的数据。树中的某个结点(除根结点外)最多只有和上一层的一个结点(即其父结点)有直接关系,根结点没有直接上层结点,因此在n个结点中的树中有n-1条边。而树中每个结点与其下一层的零个或多个结点(即其孩子结点)有直接关系。
二 树的种类与其相关操作
三 树相关的基本术语
- 考虑结点K,根A到结点K的唯一路径上的任意结点,称为结点K的祖先。如结点B是结点K的祖先,而结点K是结点B的子孙(非根结点的祖先最少为1个)。路径上的最接近结点K的结点E称为K的双亲,而K为结点E的孩子。根A是树中唯一没有双亲的结点。有相同双亲的结点称为兄弟,如结点K和结点L有相同的双亲E,即K和L为兄弟。
- 树中一个结点的孩子个数称为该结点的度,树中结点的最大度数为称为树的度。如结点B的度为2,结点D的度为3,该树的度为3。
- 度大于0的结点称为分支结点(又称非终端结点);度为0(没有子女结点)的结点称为叶子结点(又称终端结点)。在分支结点中,每个结点的分支数就是该结点的度。
- 结点的深度是从树根节点开始自顶向下逐层累加的。结点的高度是从叶子结点开始自底向上逐层累加的。树的高度(或深度)是树中结点的最大层数。
- 有序树是指树中结点的各子树从左往右是有序的,不能互换,否则为无序树。
- 树的路径和路径长度:树中两个结点之间的路径是由这两个结点之间经过的结点序列构成的,而路径长度是路径上所经过的边的个数。
- 森林:森林是指m(m>=0)棵互不相交的树的集合。森林的概念与树的概念十分相近,因为只要把树的根节点删掉就是森林。反之,只要给m棵独立的树加上一个结点,并把这m棵树作为该结点的子树,则森林就成了树。
注意:由于树中的分支是有向的,即从双亲指向孩子,所以树中的路径是从上向下的,统一双亲的两个孩子之间不存在路径,即兄弟结点之间是没有路径的。
四 树的性质
- 树中的结点数等于所有结点的度数加1(根结点)。
- 度为m的树中第i层上至多有m^(i-1)个结点(i>=1),如二叉树的第3层至少有2^2个结点。
- 高度为h的m叉树至多有((m^h)-1)/(m-1)个结点。
- 具有n个结点的m叉树最小高度为[logm^(n(m-1)+1)]。