前言
- 树形结构的关系是 1 对 n 的,树的每个元素后面都可以有多个后继,但是只能有 1 个前趋。
树形结构(非线性结构)
- 结点之间有分支。
- 具有层次关系。
1. 树的定义
树(Tree)是 n (n >= 0)个结点的有限集。
- 若 n = 0(没有元素的数),则称为空树;
- 若 n > 0,则它满足如下两个条件:
- 有且仅有一个特定的称之为根的结点,若 n = 1,则说明这棵树只有树根。
- 除根结点以外的其余结点可分为 m (m > 0) 个不互相交的有限集 T1,T2,T3,…,Tm,其中每一个集合本身又是一棵树,并成为根的子树(SubTree)。
举个例子
- 这是个只有根结点的树
- 一般的树
- A 这个元素称之为根,其余的元素分成若干个不相交的子集,称之为根的若干个子树。
- 每一个子树的第一个元素称之为根,其余的元素继续分成若干个子树。
- 显然,树的定义是一个递归的定义。
树的其他表示方式
2. 树的基本术语
- 结点:树中的每一个独立单元。包含一个数据元素以及若干指向其子树的分支。如上图中的 A B C D 等,都是一个结点,只有根结点没有前趋。
- 结点的度:结点拥有的子树数(分支数或后继数)被称为结点的度。如:A 拥有三个子树,则A的度为3,B 的度为2,C为1,D为3,F为0。
- 树的度:树内各结点的度的最大值。如上图的树的度为3,拥有分支最多的结点是 A 和 D,都有3个结点,所以整个数的度为3。
- 叶子结点:将没有子树(分支或后继)的结点称为叶子结点(终端结点)。
- 非终端结点:度 ≠ 0 (有分支或后继)的结点,称为非终端结点或分支结点,除根结点之外,非终端结点也称为内部结点。
- 双亲和孩子:结点的子树的根称为该结点的孩子,相应的,该结点称为孩子的双亲。如:A 的孩子是 BCD,B 的双亲是 A,B 的孩子有 E 和 F。
- 兄弟:同一个双亲的孩子之间互称为兄弟。如:BCD 是兄弟,HIJ 也是兄弟,KL 也是兄弟。
- 堂兄弟:双亲位于同一层的结点互为堂兄弟。如:G 与 DFHIJ 互为堂兄弟,KLM 互为堂兄弟。
- 祖先:从根结点到该结点所经分支上的所有结点称为祖先。如:从 A 到 M 经过了 ADH,所以称 ADH 为 M 的祖先。
- 子孙:以某结点为根的子树中的任一结点称为该结点的子孙。如:B 的子孙为EFKL, D 的子孙为 HIJM,M 既是H的孩子又是H的子孙,A就不用说了。
- 层次:结点的层次从根结点开始,根结点为第一层,根结点的孩子为第二层,树中任一结点的层次为其双亲结点的层次+1。
- 树的深度:树中结点的最大层次称为树的深度或高度。如:上图的树一共有4层,所以这棵树的深度(高度)为 4。
- 有序树和无序树
- 有序树:树中结点的各个子树从左至右有次序(不能互换),在有序树中最左边的子树的根 B 称为第一个孩子,最右边的D称为最后一个孩子。
如:T1 必须是左边的子树,T2必须是中间的,T3必须是最右边的,就称为有序树,T1 T2 T3的位置如果换一下就成另外一棵树了。 - 无序树:树中结点的各个子树无次序,每个子树不管在什么位置都是这棵树。
- 有序树:树中结点的各个子树从左至右有次序(不能互换),在有序树中最左边的子树的根 B 称为第一个孩子,最右边的D称为最后一个孩子。
- 森林 :是 m (M >= 0)棵互不相交的数的集合。对树中每个结点而言,其子树的集合即为森林。如:上图以 A 为根结点的树也算是一个森林,只不过这个森林只有一棵树。
- 把根节点 A 删除树就变成了森林,这样就有三棵树了。
- 一棵树可以看成是一个特殊的森林。
- 给森林中的各子树加上一个双亲结点,森林就变成了树。
- 树一定是森林,只不过这个森林只有一棵树,但是森林不一定是树
2.1 树结构和线性结构的比较
线性结构
- 第一个数据元素:无前驱。
- 最后一个数据元素:无后继。
- 其他数据元素:一个前驱,一个后继。
- 元素之间关系:一对一。
树结构
- 根结点(只有一个):无双亲。
- 叶子结点(可以有多个):无孩子。
- 其他结点(中间结点):一个双亲,多个孩子。
- 元素之间关系:一对多。
3. 二叉树的定义
每个结点最多只有两个分支的树称为二叉树。
- 二叉树的结构最简单,规律性最强。
- 所有树都能转为唯一对应的二叉树,不失一般性。
普通树(多叉树)若不转化为二叉树,则运算很难实现
- 二叉树在树结构的应用中起着非常重要的作用,因为对二叉树的许多操作算法简单,而任何树都可以与二叉树相互转换,这样就解决了树的存储结构及其运算中存在的复杂性。
二叉树的定义
- 二叉树是 n (n >= 0) 个结点的有限集,它或者是空集(n = 0),或者由一个根结点及两棵互不相交的分别称作这个根的左子树和右子树的二叉树组成。
二叉树的特点
- 每个结点最多有两个孩子(二叉树中不存在度大于2的结点)。
- 子树有左右之分,其次序不能颠倒。
- 二叉树可以是空集合(空树),根可以有空的左子树或空的右子树。
二叉树不是树的特殊情况,他们是两个概念
- 二叉树就是二叉树。
- 二叉树结点的子树要区分左子树和右子树,即使只有一棵子树,也要进行区分,说明它是左子树,还是右子树。
- 树当结点只有一个孩子时,就无需区分它是左还是右的次序。因此二者是不同的。这是二叉树与树的最主要的差别。
二叉树的形态
- 具有两个结点的 二叉树 有两种形态,要么右子树为空,要么左子树为空。
- 而有两个结点的树只有一种状态,不区分左右子树。
- 也就是说,二叉树每个结点位置或者说次序都是固定的,可以是空,但是不能说它没有位置,而树的结点位置是相对于别的结点来说的,没有别的结点时,他就无所谓左右了。
思考一下
- 具有三个结点的二叉树可能有几种不同形态?普通树呢?
3.1 二叉树的基本形态
- 虽然二叉树和树概念不同,但是有关树的基本术语对二叉树同样适用(孩子兄弟双亲…)。