树
树的定义
- 树是有n(n≥0)个结点的有限集合(n等于0时称为空树)。在一棵非空树中:
- 有且只有一个特定的结点称为根结点;
- 当n大于1时,除根结点外的结点又分为m个互不相交的子集,每个子集又是一棵树,称为根结点的子树。
为了更加直观的表示,常常用连线将根结点与其子树的根结点连接起来。如下图所示:
树的常用术语
- 结点:树的结点指一个数据元素及指向其子树的分支。
- 孩子、双亲及兄弟结点:对于树中的任一结点,其所有子树的根结点称为它的孩子结点。该结点称为孩子结点的双亲结点。一个结点的所有孩子结点互为兄弟结点。如上图中,结点B、C和D是结点A的孩子结点,相反,结点A是结点B、C和D的双亲结点。结点B、C和D互为兄弟结点。
- 祖先及子孙结点:从根结点到一个结点的路径所经过的所有结点称为该结点(包括双亲结点)的祖先结点。一个结点的所有子树上的结点称为它的子孙结点。如在上图中,结点A、B和F是结点H的祖先结点,结点E、F、G、H和I是结点B的子孙结点。
- 结点的度:每个结点的孩子结点的数目称为该结点的度。在上图中,结点A、B和C的度分别是3、2和0。
- 叶子结点:度为0的结点称为叶子结点。在上图中,结点C、D、E、G、H和I称为叶子结点。叶子结点又称为树叶结点或终端结点。
- 分支结点:度大于0的结点称为分支结点。一棵树的结点中,除了叶子结点就是分支结点。在上图中,结点A、B和F是分支结点。分支结点也称非终端结点。
- 树的度:树中所有结点中度的最大值称为树的度。
- 结点的层次:根结点的层次为第一层,根结点的孩子结点为第二层,其余结点的层次以此类推。
- 树的深度:树中结点的最大层次称为树的深度。
- 有序树、无序树:如果将树中结点的孩子结点看做从左到右有序的,则称该树为有序树,否则称为无序树。有序树中,一个结点最左边的孩子结点称为它的第一个孩子,其余的孩子依次为第二个、第三个等,最右边的一个孩子结点称为它的最后一个孩子。
- 森林:m(m≥0)棵互不相交的树的集合称为森林。树中任一结点的所有子树的集合即是森林,称为该结点的子树森林。
树的表示
- 结点连线法。结点连线法如图6-1所示,用结点表示树的结点,用连线连接结点和它的孩子结点。
- 广义表法,用一个广义表表示一棵树。空树用一个空的广义表表示。非空树的广义表只有一个元素,该元素由根结点及由括号括起来的根结点的子树的广义表表示组成。
- (A(B(E,F(G,H,I)),C,D))。
- 集合图法。用集合图表示一棵树时,用一个圆表示一棵树,圆内包含根结点和子树,子树又用相同的方法表示。
- 凹入图法,用凹入图法表示时,用一个长条形表示树的所有结点,双亲结点条形的长度大于孩子结点的条形,兄弟结点条形的长度相等。
树的运算
如果树中的结点和它的孩子结点之间有关系,一个结点与它的多个孩子之间存在关系,则树可以作为一种数据结构来描述数据元素之间存在着一对多的问题。
树的常用运算如下:
- 初始化:置树为空。
- 建立树:根据输入的数据建立树的存储结构。
- 求根结点:求一棵树的根结点。
- 求双亲结点:求一个结点的双亲结点。
- 求孩子结点:求一个结点的一个或多个孩子结点。
- 求兄弟结点:求一个结点的一个或多个兄弟结点。
- 遍历树的所有结点:依次且不重复地访问树的所有结点。
- 清空树:释放树中结点所占用的存储单元,并置树为空。
- 插入结点:在树中插入一个新结点。
- 删除结点:删除树中的一个结点。
- 查找结点:根据给定的条件查找一个指定的结点。
- 求二叉树的深度:求二叉树的最大层次数。