前言
- 数据结构的实现有两种方式,一种是顺序存储,一种是链式存储
顺序存储:使用一片连续的逻辑地址存放数据
链式存储:不用连续地址,使用指针指向下个元素的地址
- 常用数据结构有:线性表,栈,队列,树,图等等,二叉树是属于这里面的树。
BST(Binary Search Tree)介绍
BST 是一种树,他的特性是
1.左子树上所有结点的值均小于或等于它的根结点的值。
2.右子树上所有结点的值均大于或等于它的根结点的值。
3.左、右子树也分别为BST
BST的优点:
- BST 通常是使用链式结构存储实现的,使用顺序存储要么是(Full Binary Tree)或者接近(Full Binary Tree)
- 顺序存储最大的弊端是必须预先给出数组的存储空间大小插入删除比较麻烦,优点是可以节省空间,查找很快
BST的缺点:
- 抛开顺序存储和链式存储,BST数据结构本身存在的缺点是,在特定的时候,树的度会一直升高,导致查找效率变低
这个时候我们就有新的树来解决他的缺点就是(AVL Tree)
AVL Tree
AVL树,本质上是带了平衡功能的BST,他多了个平衡因子概念
即(每个结点的左右子树的高度之差的绝对值(平衡因子)最多为1),如果不满足就会旋转来满足这个条件。
上面图一BST 在avl中旋转操作后得到如下,具体怎么旋转的可以在这个网站自己模拟
https://www.cs.usfca.edu/~gal...
那么AVL 有没有什么缺点呢?
最大的缺点就是追求完美的平衡导致插入和删除需要大量的平衡计算,这个在插入和删除大的情况导致开销较大,这个时候我们就想着,有没有一种树,解决BST的缺点,同时又不要大量的计算平衡,于是RB-Tree就被发明了
RB-Tree 和 AVL 区别
- RB-Tree 的定义不介绍了,我们记得这个区别就行
删除node引起树的不平衡时,最坏情况下,AVL需要维护从被删node到root这条路径上所有node的平衡性,而RB-Tree最多只需3次旋转。
下图是解决图一不平衡RB-Tree的图
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。