数据结构——树小记
简介
二叉树
- 普通二叉树
- 二叉查找树
平衡树
- 平衡二叉树 AVL
- B-Tree
- B+Tree
- R-B-Tree
平衡树
AVL
关键
平衡因子,旋转
ps:新增或删除,导致高度变更,需向上递归检查,避免失衡
旋转
类型:LL、LR、RR、RL
- LR:先左旋后右旋
- LL:左旋
插入
- 定位到叶子,插入
- 更新高度
- 平衡调整:计算当前节点高度差,旋转保持平衡,向上递归检测
删除
删除叶子
- 定位删除
- 向上递归检测
删除单孩子
- 定位删除
- 孩子顶替
- 向上递归检测
删除双孩子
- 定位
- 找到直接前驱或后继叶子,值替换
- 改变指向实现删除叶子
- 向上递归检测
B-Tree
关键
m阶
节点和节点内实体:
class Entry {
K key;
V value;
}
class Node {
Entry[] entries;
Node[] children;
boolean isLeaf;
}
分裂
- 定位节点内中间key
- 上传给父节点
- 递归处理父节点
重平衡
- 相邻兄弟节点有多余key,旋转
- 兄弟无多余,则父key下降合并,递归处理父节点
插入
- 定位到叶子,插入
- 多则分裂
删除
非叶子节点
- 定位
- 找到直接前驱/后继节点key
- 替换,转变为删除叶子节点
叶子节点
- 定位删除
- 少则重平衡
B+Tree
比起B-Tree:
- 非叶子作为索引层,保存key
- 叶子作为存储层,保存key和value,且节点间组成链表
红黑树(略)
关键
- 节点颜色:红或黑
- 根:黑
- (NIL)叶子:黑
- 一个红色节点,子节点为黑色
- 节点到子孙节点的路径,包含相同黑色节点
平衡手段
- 旋转
- 染色
添加
- 定位插入
- 着红
- 平衡
删除
- 定位删除(包含删除叶子、删除单孩子非叶子、删除双孩子非叶子,同上处理)
- 平衡