特点:不是线性结构,一个直接前驱,可能有多个直接后继
一、案例引入
数据的压缩问题
找到代码长度最短的编码方案
等价问题
现实世界中许多应用问题可以归结为按给定的等价关系将集合划分为等价类的问题。
例:要测试一个软件是否存在问题,这个软件所有允许的输入数据构成的集合通常有很多元素。把软件所有允许的输入数据域划分成若干子集合,即等价类。然后从每个子集合中选取少数具有代表性的数据作为测试用例,这样的测试用例设计方法可以有效地避免大量的冗余测试。
并查算法是确定等价类的高效算法。
二、树的基本概念
- 树是有n个结点组成的有限集合
- 结点:树中的一个独立单元,包含一个数据元素及若干指向其子树的分支。
- 空数是n为0的树
- 根节点是无直接前驱的结点
- 叶子结点或者叶结点是无直接后继结点,也是度为0的结点,也称作终端结点
eg.如K,L,F,J,H,G,M,N结点都是叶子结点。
- 分支结点是度不为0的结点,也称作非终端结点
eg.如A,B、I等结点是分支结点。
- 兄弟结点是具有共同双亲结点的结点
eg.B、C,D互为兄弟,M,N互为兄弟。
- 双亲结点是该结点的直接前驱结点
eg.如B的双亲是A,N的双亲是l。
- 孩子结点是该结点的直接后继结点
eg.如B是A的孩子,N是I的孩子。
- 祖先结点:从根结点开始到该结点连线上的所有结点(除该结点)都是该结点的祖先。
eg.N的祖先是I,C,A。
- 子孙结点是该结点的直接后继结点和间接后继结点
- 子孙:一棵树上的任何结点(不包括根结点)称为根的子孙。
eg.如图中其它结点都是根结点A的子孙。
- 结点的度是该结点拥有子树的个数
eg.A的度为3,E的度为2。
- 树的度是树中所有结点的度的最大值
eg.树的度为3。
- 结点的层次是任一结点的层次等于双亲结点的层次加1,根结点为第1层。
- 树的深度(或高度)是树中所有结点的层次的最大值。
- 无序树是树中任意一个结点的各孩子结点之间的次序构成无关紧要的树(即结点各子树可互换位置)
- 有序树是树中任意一个结点的各孩子结点有严格排列次序的树(即结点各子树从左至右有序,不能互换)
- 森林是 m (m≥0)棵互不相交树的集合
- 树和森林的概念相近,删去一棵树的根,就得到一个森林;反之,加上一个结点作树根,森林就变为一棵树。
树的性质
- 树中的结点数等于树中所有结点的度数之和加
- 度为m 的树中第i层至多有 m的(i-1)次方个结点(i>=1)
树的表示方法
树结构的定义是一个递归的定义,也就是说,在树的定义中又用到了树的定义。它给出了树的固有特性。树的主要表示法
- 直观表示法(树形图表示法)
- 嵌套集合表示法
- 广义表表示法
- 凹入表示法
最直观的表示方法,也是最常用的
在嵌套集合中,任意两个集合或者不相交,或者一个包含另一个
与书目类似,用位置的缩进表示树的层次
1.双亲表示法
用一组连续的空间存储树中的结点,每个结点除了数据域data外还附设一个伪指针parent域,指示双亲结点位置
结点形式 一棵树及其双亲表示法的存储结构。
根结点的下标为0,伪指针域为-1
该存储结构利用了每个结点(根结点除外)只有唯一双亲的性质。在这种存储结构下,可以很方便地找到每个结点的双亲结点,但求某个结点的孩子结点时需要遍历整个结构。