1、树形结构:
元素之间存在一对多关系的数据结构,适合存储具有层次关系的数据模型,如文件树、组织关系、族谱等。
2、树的相关术语
- 根结点:树的最顶层结点,一棵树只有一个。
- 双亲结点、父节点:结点的上一层结点,一个结点只有一个双亲结点。
- 兄弟节点:具有同一个双亲结点的结点。
- 子节点:结点的下一层结点,可能会有多个。
- 叶子结点:没有子节点的结点。
- 树的高度:树的层数。
- 树的密度:树的总结点的数量。
- 树的度:根结点的子结点数(仅计算根结点的子结点)。
常见的树的种类
- 普通树:每个结点只有一个双亲结点,但子结点数量任意;通常会转化成二叉树进行分析
- 多路平衡查找树:
多路:子结点的数量存在上限(n叉树上限就是n)
平衡:所有子树的高度相差不超过1
查找:结点是按照某种规则排过序的 - 二叉树:每个结点最多只有两个子结点的树
常见的二叉树的种类
-
满二叉树:最后一层的所有结点都没有子结点,除此之外所有结点都有两个子结点
-
完全二叉树:除了最后一层,所有层的结点数是2^(n-1),最后一层按照从左到右排列。可简单理解为满二叉树的基础上,最后一层没有填满。
-
有序二叉树:所有结点的左子结点都比自己小,右子结点都比自己大,当有序二叉树按中序遍历时数据是有序的
例如:用数据 7 5 6 4 9 1 8 2 3构建有序二叉树,先令7为根结点,后续数据比当前结点小则往左边存放,比当前结点大则往右边存放。
-
平衡二叉树:每个根结点的左右子树的高度相差不超过1
例如:图中结点数值为以当前结点为根结点的子树的高度
-
线索二叉树:给普通的二叉树增加线索,使其可以使用循环的方式遍历,提高遍历速度
-
哈夫曼树:结点有权重的树,子结点可以通过权重推算父节点。该树的一个重要应用就是哈夫曼编码,可以对数据进行压缩
例如:用数据1 2 3 4 5构建哈夫曼树,先用最小的两个数构建一个临时结点,再将临时结点存入数组,再找最小的两个数构建临时结点,循环往复。
图中黑色是原数据,红色是临时结点。
-
堆:
大根堆:所有结点都比自己的左右子结点大
小根堆:所有结点都比自己的左右子结点小