二叉排序树BST(二叉查找树) 二叉平衡树AVL 红黑树
动态查找树主要包括:二叉查找树,平衡二叉树,红黑树,B树,B-树,查找的时间复杂度就为O(log2N),通过对数就可以发现降低树的深度就会提高查找效率
需要的应用场景
大量的数据会存储到外存磁盘,外存磁盘中读取与写入某数据的时候,首先定位到磁盘中的某一块,所以我们就需要一种高效的数据结构来有效的查找磁盘中的数据
二叉排序树BST
二叉排序树,也称二叉查找树
- 若左子树非空,则左子树上所有节点值均小于根节点
- 若右子树非空,则右子树上所有节点值均大于根节点
- 左、右子树本身也分别是一颗二叉搜索树
平衡二叉树(平衡树)
为避免树的高度增长过快,降低二叉排序树的性能,我们规定在插入和删除二叉树结点时,要保证任意节点的左右子树高度差的绝对值不超过1,将这样的二叉树成为平衡二叉树
平衡二叉树(Balanced Binary Tree),简称平衡树(AVL), 两个是一回事,AVL是发明者的首字母
也叫二叉平衡查找树 或 二叉平衡搜索树
平衡二叉树是基于二分法的策略提高数据的查找速度的二叉树的数据结构
平衡二叉树是一种特殊的二叉排序树
插入节点后若导致树不平衡会调整节点
AVL树平衡调整
- LL平衡旋转(右单旋转)
- RR平衡旋转(左单旋转)
- LR平衡旋转(先左后右双旋转)
- RL平衡旋转(先右后左双旋转)
红黑树
红黑树,Red-Black Tree ,RBT
当在10亿数据进行不到30次比较就能查找到目标时,不禁感叹编程之魅力!人类之伟大呀! —— 学红黑树有感。
平衡二叉树保证了在最差的情况下,二叉树依然能够保持绝对的平衡,即左右两个子树的高度差的绝对值不超过1。但是这又会带来一个问题,那就是平衡二叉树的定义过于严格,导致每次插入或者删除一个元素之后,都要去维护二叉树整体的平衡,这样产生额外的代价又太大了。二叉搜索树可能退化成链表,而平衡二叉树维护平衡的代价开销又太大了,那怎么办呢?这就要谈到“中庸之道”的智慧了。说白了就是把平衡的定义适当放宽,不那么严格,这样二叉树既不会退化成链表,维护平衡的开销也可以接受。没错,这就是我们要谈的红黑树了。
红黑树是一种自平衡的二叉查找树,含有红黑节点
- 性质1:每个节点要么是黑色,要么是红色。
- 性质2:根节点是黑色。
- 性质3:每个叶子节点(NIL)是黑色。
- 性质4:每个红色结点的两个子结点一定都是黑色。没有两个相邻的红色节点(红色节点不能有红色父节点或红色子节点,并没有说不能出现连续的黑色节点)
- 性质5:任意一结点到每个叶子结点的路径都包含数量相同的黑结点
红黑树并不是一个完美平衡二叉查找树,从图1可以看到,根结点P的左子树显然比右子树高,但左子树和右子树的黑结点的层数是相等的,也即任意一个结点到到每个叶子结点的路径都包含数量相同的黑结点(性质5)。所以我们叫红黑树这种平衡为黑色完美平衡
前面讲到红黑树能自平衡,它靠的是什么?三种操作:左旋、右旋和变色。
- 左旋:以某个结点作为支点(旋转结点),其右子结点变为旋转结点的父结点,右子结点的左子结点变为旋转结点的右子结点,左子结点保持不变。如图3。
- 右旋:以某个结点作为支点(旋转结点),其左子结点变为旋转结点的父结点,左子结点的右子结点变为旋转结点的左子结点,右子结点保持不变。如图4。
- 变色:结点的颜色由红变黑或由黑变红。
平衡二叉树到红黑树的演变
https://zhuanlan.zhihu.com/p/103306156