平衡二叉搜索树
平衡二叉搜索树
二叉搜索树的问题:
- 添加:若从小到大添加元素,那么二叉搜索树将退化成链表
- 删除:删除节点时也可能会导致二叉搜索树退化成链表
平衡(Banlance)
平衡:当节点数量固定时,左右子树的高度越接近,这棵二叉树就越平衡(高度越低)
最理想的状态就是像完全二叉树、满二叉树那样,高度是最小的。
解决方案
前提:节点的添加、删除顺序是无法限制的,可以认为是随机的。
改进方案:在节点的添加、删除操作之后,想办法让二叉搜索树恢复平衡(减小树的高度),同时添加、删除节点之后的调整次数一定要少,即用尽量少的调整次数达到适度平衡。
- 一颗达到适度平衡的二叉搜索树,可以称之为:平衡二叉搜索树
两大猪脚--AVL树和红黑树
- AVL树:Windows NT 内核中广泛使用
- 红黑树:
1. C++ STL(比如 map、set )
2. Java 的 TreeMap、TreeSet、HashMap、HashSet
3. Linux 的进程调度
4. Ngix 的 timer 管理
一般也称它们为:自平衡的二叉搜索树(Self-balancing Binary Search Tree)