树的遍历
- 前序遍历:根左右
- 后序遍历:左右根
- 中序遍历:左根右
搜索二叉树
- 是一棵二叉树
- 任意节点的左孩子的值均小于自身的值,右孩子的值大于自身的值;
中序遍历
,是升序
排列
平衡二叉树
- 是一棵二叉树
任意节点
的左右两个子树的高度差不超过1(<=1)
平衡树的实现
- AVL Tree
- 每个节点都记录左右子树的高度差
- 严格平衡
- B Tree
- Splay Tree
红黑树
近似平衡
的二叉查找树- 每个节点要么是红色,要么是黑色
- 根节点是黑色
- 红节点不能连续
- 对于每个节点,从该节点至
叶子节点
的任意路径,都含有相同个数量的黑色节点
红黑树 vs AVL Tree
- AVL Tree 查询相对来说较快;因为 AVL 是严格平衡的,而红黑树是近似平衡的
- 为了严格的平衡性,付出的代价是:1.每个节点存的额外信息会更多;2.调整的频次也更高;
- 红黑树的插入和删除操作相对来说比较快,因为调整的频次相对较低
- 编程语言中的工具方法大多采用红黑树,而数据库层面多使用 AVL
- 数据库中一般查询远大于插入修改
树的旋转
左旋转
逆时针旋转红黑树的两个节点,使得父节点被自己的右孩子取代,而自己成为自己的左孩子
。
右旋转
顺时针旋转红黑树的两个节点,使得父节点被自己的左孩子取代,而自己成为自己的右孩子
。
B 树
https://zh.wikipedia.org/wiki/B%E6%A0%91
- B-tree,又称 B- 树
- 是一种
多路平衡查找
树(多叉树) - 对于一棵 m 阶树
- 每一个节点最多有 m 个子节点
- 每一个非叶子节点(除根节点)最少有 ⌈m/2⌉ 个子节点
- 如果根节点不是叶子节点,那么它至少有两个子节点
- 有 k 个子节点的非叶子节点拥有 k − 1 个键
- 所有的叶子节点都在同一层
B+ 树
-
一种 B-tree 的变形树
-
除了根之外的每个节点都包含最少 m/2 个元素,最多 m-1 个元素
-
对于任意的结点有最多 m 个子指针。
-
对于所有内部节点,子指针的数目总是比元素的数目多一个。
-
所有叶子都在相同的高度上,叶结点本身按关键字大小从小到大链接。
-
为什么 B+ tree 比 B tree 更适合做数据库索引
- B+ tree 的磁盘读写代价更低
- B+ tree 的查询效率更加稳定