java学习之数据结构:四、树
主要对各种树进行介绍
目录
1.二叉树
1.1满二叉树
1.2完全二叉树
1.3有序二叉树
1.4平衡二叉树
1)LL型
2)LR型
3)RR型
4)RL型
2.B树
2.1B树与平衡二叉树区别
2.2B树条件
2.3B树添加过程
3.红黑树
3.1定义
3.2性质
4.哈夫曼树
4.1一些定义
4.2构建过程
1.二叉树
定义:二叉树是一种非线性数据结构,代表“祖先”与“后代”之间的派生关系,体现了“一分为二”的分治逻辑。与链表类似,二叉树的基本单元是节点,每个节点包含值、左子节点引用和右子节点引用。每个节点都有两个引用(指针),分别指向左子节点和右子节点,该节点被称为这两个子节点的父节点。当给定一个二叉树节点时,将该节点的左子节点及其以下节点形成的树称为该节点的左子树。在二叉树中,除叶子节点外,其他所有节点都包含子节点和非空子树。
二叉树一般可以使用两种结构存储,一种顺序结构,一种链式结构。
1.1满二叉树
定义:是一颗每层节点数都达到其最大值的二叉树。如果一棵 二叉树的层数为 K ,且结点总数是2^k-1 ,则它就是满二叉树 。
1.2完全二叉树
定义:是由满二叉树引申过来的,对于深度为 K 的,有 n个结点的二叉树,当且仅当其每一个结点都与深度为K 的满二叉树中编号从 0 至 n-1 的结点一一对应时称之为完 全二叉树。 要注意的是满二叉树是一种特殊的完全二叉树。
简单说,就是最底层节点尽量靠左填充。
1.3有序二叉树
定义:对于任意节点,其左子树中的所有节点的值都小于该节点的值,而右子树中的所有节点的值都大于该节点的值。
1.4平衡二叉树
定义:任意节点的左子树和右子树的高度之差的绝对值不超过1
操作:在插入节点时,为了保证是平衡二叉树,需要进行以下操作:
1)LL型
如下图所示,以不平衡节点为基础进行右旋。中间节点最后成为父节点
2)LR型
如下图所示,绿色节点为基础,先左旋再右旋。最后造成不平衡节点成为父节点
3)RR型
如图所示,类似LL,将红色节点右旋,最后中间节点作为父节点
4)RL型
如下图所示,将破坏节点作为旋转节点,先右旋再左旋。最后破坏节点为父节点。
2.B树
2.1B树与平衡二叉树区别
B 树就是平衡多路(即不止两个子树)查找树,它和平衡二叉树的不同有这么几点:
- 平衡二叉树节点最多有两个子树,而 B 树每个节点可以有多个子树,M 阶 B 树表示该树每个节点最多有 M 个子树
- 平衡二叉树每个节点只有一个数据和两个指向孩子的指针,而 B 树每个中间节点有 k-1 个关键字(可以理解为数据)和 k 个子树( **k 介于阶数 M 和 M/2 之间,M/2 向上取整)
- B 树的所有叶子节点都在同一层,并且叶子节点只有关键字,指向孩子的指针为 null
和平衡二叉树相同的点在于:B 树的节点数据大小也是按照左小右大,子树与节点的大小比较决定了子树指针所处位置。
下图对比:
2.2B树条件
- 若根结点不是终端结点,则至少有2棵子树
- 除根节点以外的所有非叶结点至少有 M/2 棵子树,至多有 M 个子树(关键字数为子树减一)
- 所有的叶子结点都位于同一层
2.3B树添加过程
以下图为例,构建一颗s阶B树。值得注意的是,每次“挤上去”的节点不同,所以构建出来的B树也有所不同。
1)首先确定B树的阶数---3阶,即分支中最大节点数不能超过3
2)添加元素并排序,此时节点数超过三,则将40挤上去,如下图
3)继续构建,添加元素,再次出现4节点时挤上去:
4)继续上述操作
5)继续构建,构建完成
3.红黑树
3.1定义
红黑树是一种自平衡二叉查找树,是在计算机科学中用到的一种数据结构。 红黑树是一种平衡二叉查找树的变体,它的左右子树高差有可能大于 1,所以红黑树不是严格意义上的平衡二叉树(AVL),但 对之进行平衡的代价较低, 其平均统计性能要强于 AVL 。
3.2性质
性质1. 结点是红色或黑色。
性质2. 根结点是黑色。
性质3. 所有叶子都是黑色。(叶子是NULL结点)
性质4. 每个红色结点的两个子结点都是黑色。(从每个叶子到根的所有路径上不能有两个连续的红色结点)
性质5. 从任一节结点到每个叶子的所有路径都包含相同数目的黑色结点
所以可以推断出:从根到叶子的最长的可能路径不多于最短的可能路径的两倍长。
4.哈夫曼树
4.1一些定义
路径:在一棵树中,一个结点到另一个结点之间的通路,称为路径。
路径长度:在一条路径中,每经过一个结点,路径长度都要加 1 。
结点的权:给每一个结点赋予一个新的数值,被称为这个结点的权。
结点的带权路径长度:指的是从根结点到该结点之间的路径长度与该结点的权的乘积。
树的带权路径长度为树中所有叶子结点的带权路径长度之和。通常记作 “WPL” 。
哈夫曼树:当用 n 个结点(都做叶子结点且都有各自的权值)构建一棵树时,如果构建的这棵树的带权路径长度最小,称这棵树为“最优二叉树”,有时也叫“赫夫曼树”或者“哈夫曼树”。
在构建哈弗曼树时,要使树的带权路径长度最小,需要遵循一个原则:权重越大的结点离树根越近。
4.2构建过程
- 在 n 个权值中选出两个最小的权值,对应的两个结点组成一个新的二叉树,且新二叉树的根结点的权值为左右孩子权值的和;
- 在原有的 n 个权值中删除那两个最小的权值,同时将新的权值加入到 n–2 个权值的行列中,以此类推;
- 重复 1 和 2 ,直到所以的结点构建成了一棵二叉树为止,这棵树就是哈夫曼树。
文章参考:https://www.cnblogs.com/1873cy/p/18392848
重温数据结构:理解 B 树、B+ 树特点及使用场景-腾讯云开发者社区-腾讯云