【各类二叉树】
- 二叉树的特点:兼顾静态查找和动态修改,即既能像数组一样快速查找也能像链表一样快速增删
- 二叉树:每个节点的度数不超过2
- 真二叉树:每个节点的度数为0或2
- 完全二叉树:叶节点在最底部的两层,且最底层的叶节点在左侧
- 满二叉树:所有叶节点都在最底层,每层节点度数为2
- 二叉搜索树BST:使得二叉树更加高效地实现查找,类似数组有序后的查找,其特点为:
- 任意节点大于或等于左孩子,小于或等于右孩子
- 中序遍历单调非降
- 平衡二叉搜索树BBST:在BST的基础上,使得兄弟子树的高度彼此接近,全树尽可能平衡。(BST查找性能取决于高度,例如对顺序或逆序的一组数据,插入BST中,BST就变得像链表一样)
- AVL树:一种实现BBST的方式,其特点是:
- 各节点左右子树的高度差不超过1
- 最坏情况下,单次动态修改和静态查找均可以在O(logn)时间内完成
- 伸展树:有些数据经常用到,有些数据很少用到,将最近访问的数据(查找、增加操作)放在根节点,其特点为:
- 单次操作可以在分摊的O(logn)时间内完成
- 在最坏情况下单次操作需要Ω(n)的时间,可靠性和稳定性不高
- B树:数据规模达到内存不足以容纳时,常规BBST大降(因为访问外存次数变多,访问内存上万次所费时间和访问外存一次时间相当),其特点为:
- 各节点和其孩子节点合并成为一个大节点
- 每次从外存读取时会读取到包含很多小节点(即关键码)的大节点,而不是一个节点
- 红黑树:AVL树在删除操作后可能要多次做重平衡而使得树的拓扑结构发生大幅度变化,红黑树通过为节点指定颜色,使得每次插入和删除操作后的重平衡过程中,树的拓扑结构的更新仅涉及常数个节点,即变化幅度小,其特点为:
- 根节点为黑色
- 叶节点为黑色
- 红色节点的两个孩子节点为黑色
- 从任一叶结点到根节点所经过的黑色节点数目相同
- 任一节点左右子树的高度差不超过2倍
【应用】
- 二叉树:哈夫曼编码、堆排序、海量数据并发查询
- AVL树:windows对进程地址空间的管理
- 红黑树:C++的STL中的map和set实现
- B树:磁盘文件组织、数据库索引
- 字典树:前缀匹配、IP选路
- 四叉树:2D空间自适应分割、碰撞检测
- 八叉树:3D空间自适应分割、碰撞检测
【参考】
邓俊辉数据结构