树与二叉树
Ⅰ 树(Tree)
A. 树的概念
树状图是一种数据结构,它是由n(n>=1)个有限结点组成一个具有层次关系的集合。把它叫做“树”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。它具有以下的特点:
每个结点有零个或多个子结点;没有父结点的结点称为根结点;每一个非根结点有且只有一个父结点;除了根结点外,每个子结点可以分为多个不相交的子树
概念是很模糊的,意义不大,我用几棵树的图来做个直观表述,根据图我们再来理解树的概念。
树这个数据结构真的很像我们现实生活中的树,树里的每一个元素我们叫做 “节点”;用来连接相邻节点之间的关系,我们叫做 “父子关系”。
比如下面这棵树👇
C 节点就是 E节点的父节点,E 节点是 C 节点的子节点。E,F,G 这三个节点的父节点是同一个节点,所以它们之间互称兄弟节点。我们把没有父节点的节点叫做根节点,也就是上图中的 A 节点。我们把没有子节点的节点叫做叶子节点或者叶节点,也就是图中的 B,E,F,G 节点。
除此之外,关于“树”,还有三个比较相似的概念:高度(Height)、深度(Depth)、层(Level)。它们的定义如下:
我用一张图来说明一下这几个概念。
这几个概念我们可以从生活中出发来理解,一般我们说“高度”,都是自下而上度量,比如我们要度量第 10 层楼的高度,都是从地面开始算。所以树这种数据结构的高度也是一样,从底层开始计数,计数起点从 0 开始。
“深度”这个概念我们一般是从上往下看的,比如湖的深度,是从水平面开始量的,所以树的深度也是类似的,从根节点开始度量,计数起点也是 0 。
关于树我们可以很清晰地知道,树的存储结构是非线性表数据结构,是一对多的。
关于树,还有两个相关的概念需要了解:节点的度和树的度。
-
节点的度:一个节点的子节点数量,称为该节点的度。
-
树的度:树中节点的度的最大值。
以下面这个树为例,我们来搞清楚关于树的这几个名词。
树的度:4
树的层数:4
树中的节点总数:18
叶子节点数:11
B. 树的表达形式(存储结构)
由于树的每一个节点的最大子节点数量是不确定的,意味着其子节点数量不确定,因此,很难给出一个相对稳定的存储结构。我用 C 语言简单描述一下。
typedef struct TREE_NODE {
USER_TYPE data;
int childCount;
struct TREE_NODE **children;
}TREE_NODE;
USER_TYPE 根据用户需要存入的数据类型改变。
也可以用连续存储空间表示一棵树,如上面这颗可以表示为👇
左边一列为下标。
但是这样表示有个很大的缺陷