目录
相关文章
- 学习数据结构理论+算法时间复杂度
- 学习有序二叉树+平衡二叉树+红黑树
- 学习冒泡排序+选择排序并使用java写代码
- 学习插入排序+希尔排序并使用java写代码
- 学习堆排序+基数排序并使用java写代码
- 学习递归+归并排序+快速排序并使用java写代码
树
二叉树:就是一个节点最多能分两个叉;
多叉树:就是一个节点可分多个叉。
有序二叉树
特点:
左边节点的值小于当前节点,右边节点的值大于当前节点。
构建有序二叉树
用10、5、20、8、15、30、1构建有序二叉树。
- 10作为根节点;
- 5比10小,放到左边;
- 20比10大,放到右边;
- 8比10小,比5大,放到5的右边;
- 15比10大,比20小,放到20的左边;
- 30比10大,比20大,放到20的右边;
- 1比10小,比5小,放到5的左边。
在有序二叉树中查找
想找查找15,跟二分查找法相似:
- 拿15跟10根节点比较,比10大,只能在10的右边找,丢掉10的左边;
- 拿15跟20节点比较,比20小,只能在20的左边找,丢掉20的右边;
- 拿15跟15节点比较,两个数值相等,找到了,结束。
时间复杂度
层数 | 节点数 |
---|---|
第一层 | 1 = 2 0 1=2^0 1=20 |
第二层 | 2 = 2 1 2=2^1 2=21 |
第三层 | 4 = 2 2 4=2^2 4=22 |
第四层 | 8 = 2 3 8=2^3 8=23 |
…… | …… |
第y层 | 1 = 2 y − 1 1=2^{y-1} 1=2y−1 |
总结点数:
x
=
2
0
+
2
1
+
2
2
+
2
3
+
⋯
+
2
y
−
1
=
2
y
−
1
x=2^0 + 2^1 + 2^2 + 2^3 + \dots + 2^{y-1}=2^y - 1
x=20+21+22+23+⋯+2y−1=2y−1
可以看作为:
x
=
2
y
x=2^y
x=2y
换算成y与x的关系:
y
=
l
o
g
x
y=logx
y=logx
得出时间复杂度是:
O
(
l
o
g
n
)
O(logn)
O(logn)
练习:构建有序二叉树
用5、7、4、2、0、3、1、6构建有序二叉树。
- 以5为根节点;
- 7比5大,放在5的右边;
- 4比5小,放在5的左边;
- 2比5小,比4小,放在4的左边;
- 0比5小,比4小,比2小,放在2的左边;
- 3比5小,比4小,比2大,放在2的右边;
- 1比5小,比4小,比2小,比0大,放在0的右边;
- 6比5大,比7小,放在7的左边。
有序二叉树的缺点
从练习的有序二叉树中可以得出,它不稳定,时间复杂度也不稳定。
稳定的是平衡二叉树
平衡二叉树
特点:
1. 平衡二叉树是无论给出什么样的数据最终造出的结构如下图的样式:
它的时间复杂度能够稳定在O(logn)。
2. 左边节点的值小于当前节点,右边节点的值大于当前节点。
3. 一个节点左边子树的高度和右边子树的高度,其高度差的绝对值不能超过1。
4. 利用四种旋转:LL、LR、RR、RL构建二叉树
LL旋转
左边有2层,右边有0层。
旋转步骤:
- 让5往右旋。
LR旋转
左边有2层,右边有0层。
旋转步骤:
- 先让大的上去,小的下来:3下来,4上去;
- 让5往右旋。
RR旋转
左边有0层,右边有2层。
旋转步骤:
- 让5往左旋。
RL旋转
左边有0层,右边有2层。
旋转步骤:
- 让上面的下来,下面的上去:10下来,8上去;
- 让5往左旋。
构建平衡二叉树
用5、7、4、2、0、3、1、6构建平衡二叉树。
- 以5为根节点;
- 7比5大,放在5的右边;
- 4比5小,放在5的左边;
- 2比5小,比4小,放在4的左边;
- 0比5小,比4小,比2小,放在2的左边;
- 出现了不平衡,4的左边有2层,右边有0层,进行LL旋转,让4往右旋转;
- 继续,3比5小,比2大,比4小,放在4的左边;
- 出现了不平衡,5的左边有3层,右边有1层,进行LR旋转,让2下来,4上去,5在往右旋转;
- 继续,1比4小,比2小,比0大,放在0的右边;
- 6比4大,比5大,比7小,放在7的左边;
- 出现了不平衡,5的左边有0层,右边有2层,进行RL旋转,让6上去,7下来,5在往做旋转;
- 构建完成。
练习:构建平衡二叉树
用130、7、20、40、50、75、19、62、53、176构建平衡二叉树。
- 130作为根节点;
- 7比130小,放在130的左边;
- 20比130小,比7大,放在7的右边;
- 出现不平衡,130左边有2层,有比那有0层,进行LR旋转:
- 7下来,20上去;
- 130在右旋转;
- 继续,40比20大,比130小,放在130的左边;
- 50比20大,比130小,比40大,放在40的右边;
- 出现不平衡,130左边有2层,右边有0层,进行LR旋转:
- 让40下来,50上去;
- 130在进行右旋转;
- 继续,75比20大,比50大,比130小,放在130的左边;
- 出现不平衡,20左边有1层,右边有3层,进行RR旋转:
- 让20进行左旋转;
- 让20进行左旋转;
- 继续,19比50小,比20小,比7大,放在7的右边;
- 62比50大,比130小,比75小,放在75的左边;
- 出现不平衡,130左边有2层,右边有0层,进行LL旋转:
- 让130进行右旋转;
- 让130进行右旋转;
- 继续,53比50大,比75小,比62小,放在62的左边;
- 176比50大,比75大,比130大,放在130的右边;
- 完成构建。
平衡二叉树的缺点
每次来个节点都要一路检测到根节点是否平衡,消耗计算机性能。
红黑树
红黑树又叫最优二叉树。
特点:
即不消耗计算机的性能,又使时间复杂度稳定在O(logn)。
整个构建节点不是红色就是黑色,根节点永远是黑色;
从根节点到任意叶子节点路径上黑色节点数目是相同的;
叶子节点都是黑色,而且值是null;
在红黑树上,从根节点到叶子节点没有一条路径比其他路径长度超过两倍;
- 最长:黑+红+黑+红+黑+红+叶子
- 最短:黑+黑+黑+叶子
可由2-3-4树转换为红黑树,2-3-4树存储的value值是有序的,且是从下往上构建。
二节点
存一个数值,存两个地址,分两个叉。
三节点
存两个数值,存三个地址,分三个叉。
四节点
存三个数值,存四个地址,分四个叉。
构建2-3-4树
使用1330、7、20、40、11、75、19、62、53、176、48、29、99、200、120构建-3-4树,步骤如下:
- 130是一个二节点;
- 7小于130,放在前面,7和130是三节点;
- 20比7大,比130小,放在中间,7、20、130是四节点;
- 40比20大,比130小,放在40和130的中间;
- 7、20、40、130没有存四个数值的节点,所以把中间值往上挤;
- 11比40下,往左边比较,比7大,比20小,放在7个20的中间;
- 75比40大,往右边比较,比130小,放在130的左边;
- 19比40下,往左边比较,比11大,比20小,放在11和20的中间;
- 7、11、19、20没有存4个数值的节点,中间值往上移,选11和19都可,但习惯将后面的上移;
- 62比40大,往右边比较,比75小,放在75的左边;
- 53比40大,往右边比较,比62小,放在62的左边;
- 53、62、75、130没有存4个数值的节点,75上移;
- 176比75大,往最右边比,比130大,放在130的右边;
- 48介于40和75之间,往53、62比较,比53小,放在53的左边;
- 29介于19和40之间,往20这放,比20大,放在20的右边;
- 99比75大,往最右边比,比130小,放在130的左边;
- 200比75大,往最右边比,比176大,放在176的右边;
- 99、130、176、200没有存4个数值的节点,176上移;
- 19、40、75、176没有存4个数值的节点,75上移;
- 120比75大,比176小,介于99和130,放在99和130中间;
- 完成构建2-3-4树。
2-3-4树转换红黑树
将2-3-4树转换红黑树,有转换机制:
- 二节点会被转换为黑色节点;
- 三节点会被转换为一个黑色节点和一个红色节点,有两种转换结果:
- 黑色是小的节点,红的是大的节点;
- 红的是小的节点,黑色是大的节点;
- 四节点会被转换为一个黑色节点和两个红色节点,一大一小数值放在红色中,中间数值放在黑色中;
构建红黑树
将上面构建成功的2-3-4树转换成红黑树,过程如下;
- 75二节点,转换为黑色;
- 176是二节点,转换为黑色;
- 19和40是三节点,转换为一黑一红;
- 7和11是三节点,转换为一黑一红;
- 20和29是三节点,转换为一黑一红;
- 48、53、62是四节点,转换为一黑两红;
- 99、120、130是三节点,转换为一黑两红;
- 200二节点,转换为黑色;
- 完成构建红黑树。