目录
一. 数据结构
1. 线性存储结构:常见的线性结构有数组、链表、队列、栈、顺序表、广义表等。线性结构又分为顺序存储(如数组)和链式存储(如链表)。
特点:除第一个元素只有一个“后继”和最后一个元素只有一个“前驱”,其它每个元素只有一个“前驱”元素和一个“后继”元素。
注意:队列和栈本身不是一种数据结构,可通过数组或链表实现。
2. 非线性存储结构:常见的非线性结构有二维数组、树和图。
特点:每个元素可以和多个元素“连接”。
二. 术语

图1:树的存储结构
图1L:图1左半部分;图1R:图1右半部分
图1L的这些元素具有的就是 "一对多" 的逻辑关系,例如元素 A 同时和 B、C、D 有关系,元素 D 同时和 A、H、I、J 有关系等。 观察这些元素之间的逻辑关系会发现,它们整体上很像一棵倒着的树(将图1R 倒过来),这也是将存储它们的结构起名为“树”(或者 "树形")的原因。
存储具有 "一对多" 逻辑关系的数据,数据结构推荐使用树存储结构。
2.1. 结点
和链表类似,树存储结构中也将存储的各个元素称为 "结点"。例如在图1L中,元素 A 就是一个结点。
对于树中某些特殊位置的结点,还可以进行更细致的划分,比如:
- 父结点(双亲结点)、孩子结点和兄弟结点:以图1L 中的结点 A、B、C、D 为例,A 是 B、C、D 结点的父结点(也称为“双亲结点”),而 B、C、D 都是 A 结点的孩子结点(也称“子结点”)。对于 B、C、D 来说,它们都有相同的父结点,所以它们互为兄弟结点;
- 树根结点(简称 "根结点" ):特指树中没有双亲(父亲)的结点,一棵树有且仅有一个根结点。例如图1L中,结点 A 就是整棵树的根结点;
- 叶子结点(简称 "叶结点" ):特指树中没有孩子的结点,一棵树可以有多个叶子结点。例如图1L中,结点 K、L、F、G、M、I、J 都是叶子结点。
2.2. 子树
仍以图1L 的树为例,A 是整棵树的根结点。但如果单看结点 B、E、F、K、L 组成的部分来说,它们也组成了一棵树,结点 B 是这棵树的根结点。通常,我们将一棵树中几个结点构成的“小树”称为这棵树的“子树”。
知道了子树的概念后,树也可以这样定义:树是由根结点和若干棵子树构成的。例如,图1L这棵树就是由结点 A 和分别以 B、C、D 为根节点的子树构成。
注意:单个结点也可以看作是一棵树,该结点即为根结点。例如图1L中,结点 K、L、F 各自就可以看作是一棵树,只不过树中只有一个根节点而已。
2.3. 度
一个结点拥有子树的个数,就称为该结点的度(Degree)。例如图1L中,根结点 A 有 3 个子树,它们的根节点分别是B、C、D,因此结点 A 的度为 3。
比较一棵树中所有结点的度,最大的度即为整棵树的度。比如图1L中,所有结点中最大的度为 3,所以整棵树的度就是 3。
2.4. 层次(深度/高度)
从一棵树的树根开始,树根所在层为第一层,根的孩子结点所在的层为第二层,依次类推。
对于图1L这棵树来说,A 结点在第一层,B、C、D 为第二层,E、F、G、H、I、J 在第三层,K、L、M 在第四层。
树中结点层次的最大值,称为这棵树的深度或高度。例如图1L这棵树的深度为 4。
如果两个结点的父结点不同,但它们父结点的层次相同,那么这两个结点互为堂兄弟。例如图1L 中,结点 G 和 E、F、H、I、J 的父结点都在第二层,所以它们互为堂兄弟。
2.5. 有序树和无序树
如果一棵树中,各个结点左子树和右子树的位置不能交换,那么这棵树就称为有序树。反之,如果树中结点的左、右子树可以互换,那么这棵树就是一棵无序树。
在有序树中,结点最左边的子树称为 "第一个孩子",最右边的称为 "最后一个孩子"。拿图1L这棵树来说,如果它是一棵有序树,那么以结点 B 为根结点的子树为整棵树的第一个孩子,以结点 D 为根结点的子树为整棵树的最后一个孩子。
2.6. 森林
由 m(m >= 0)个互不相交的树组成的集合就称为森林。比如图1L中除去 A 结点,那么分别以 B、C、D 为根结点的三棵子树就可以称为森林。
前面讲到,树可以理解为是由根结点和若干子树构成的,而这若干子树本身就是一个森林,因此树还可以理解为是由根结点和森林组成的。
2.7. 空树
简单了解即可。空树指的是没有任何结点的树,连根结点都没有。
三. 树的其他表示方法
除了图1L这样画一棵树之外,还有其它的方式可以表示一棵树。

图2
图2 左侧是以嵌套集合的形式表示的(集合之间绝不能相交,即任意两个圆圈不能有交集)。
图2 右侧使用的是凹入表示法,最长条为根结点,相同长度的表示在同一层次。例如 B、C、D 长度相同,都为 A 的子结点,E 和 F 长度相同,为 B 的子结点,K 和 L 长度相同,为 E 的子结点,依此类推。
还可以用广义表表示一棵树。例如图1L用广义表表示为:
(A , ( B ( E ( K , L ) , F ) , C ( G ) , D ( H ( M ) , I , J ) ) )
四. 结点和节点
节点和结点的区别有概念来源不同、所表示的物理意义不同、应用场景不同、代表的数据结构不同。
节点是一个实体,它具有处理的能力。例如,网络上的一台计算机就是一个节点,它可以接收、发送、处理数据。节点也可以指一些具有特定功能的设备或模块,例如,路由器、交换机、传感器等。
结点是一个交叉点、一个标记,算法中的点一般都称为结点。例如,数据结构中的链表、树、图等都是由结点组成的。结点通常用来表示数据元素或者算法中的状态。
1. 概念来源不同。节点一词来源于数学与物理,表示在空间中一定位置的点。结点一词来源于计算机科学,表示数据结构中存储或处理数据的点。所以,节点属于数学概念,结点属于计算机概念。
2. 所表示的物理意义不同。节点通常表示结构、空间或过程中的一定位置或点,没有数据存储的概念。而结点是用于存储或处理数据的位置,结点之间通过指针或链表相连,具有数据存储和组织功能。
3. 应用场景不同。节点一词广泛应用于各个领域表示位置或点的概念,如生物医学、工程技术等。而结点一词主要应用于计算机算法和数据结构,如链表、树、图等。结点概念专属于计算机技术领域。
4. 代表的数据结构不同。节点没有特定的数据结构,只作为某种结构的点或位置,数据存储量可大可小。而结点由若干存储单元组成,代表了链表、树、图等数据结构,具有固定的数据组织形式。
五. 总结
树是一种非线性存储结构,通常用来存储逻辑关系为 "一对多" 的数据。
使用树结构存储的各个结点,它们之间的关系类似于家谱中的成员关系,比如有父子关系、兄弟关系、表兄弟关系等。
645





