搜索与数据结构(BST、AVL 树、红黑树)
这是我参与「第三届青训营 -后端场」笔记创作活动的第1篇笔记 主要用于快速理解的笔记,可能描述不足够详细!
发展历程:
—> 线性查找(性能低)
—> 二分查找(操作需要移动大量元素)
—> BST(不平衡,可能会退化成链表问题)
—> AVL 树(数据变化有频繁更新结构问题)
—> 红黑树
顺序搜索
特点
- 线性搜索:从头到尾一一遍历
- 复杂度 O(n)
- Slow
二分搜索
特点
- 有序的前提下,根据规律折半搜索区间
- 复杂度 O(log 2 n)
- Very fast
- **插入/删除 **需要移动大量元素
二叉搜索树(B S T)
特点
- 一颗二叉树,左子树 < 父节点 < 右子树
- 和有序序列上的二分查找一样的查找效率
- 插入/删除 不需要大量移动元素
- 复杂度 O(h) 二叉树高度
- 不平衡则会导致时间复杂度越来越高
二叉平衡树(A V L)
特点
- 任何结点中,左子树和右子树高度相差不超过 1
- 结点的平衡因子 = 右子树高度 - 左子树高度(或反之)
- 失衡的四种情况:LL(右旋)、RR(左旋)、LR(先左旋,后右旋)、RL(先右旋,后左旋)
- 不断调整很麻烦!
红黑树(R B T)
特点
自平衡的二叉查找树。
搜索效率 AVL > RBT
操作效率 AVL < BRT
概念
红黑树:
黑色高度
每个结点到叶子结点经过的黑色结点数
特点
- 红树不能有红色子节点
- 任何结点到达叶子结点,路径上黑树数量一定相同(空指针也是黑色的)
- 插入:两红时,父亲有兄弟结点,则把父亲和他的兄弟变黑
- 删除:两红时,父亲没有兄弟结点,根据 AVL 树的规律进行旋转;