Willson Chen

Stay Hungry, Stay Foolish.

数据结构 – 树

数据结构 – 树

二叉排序树

  • 特点:
    • 左子树小于根节点,右子树大于根节点。
    • 左子树和右子树都是二叉排序树。
  • 问题:可能出现不平衡,退化成链表,导致查询性能从log(n)退化成n。

平衡二叉排序树

  • 在二叉排序树基础上增加约束条件。
  • 插入和删除时做少量调整,使树保持相对平衡。
  • 其实现主要有 AVL 树和红黑树。

AVL 树

  • 最早发明的平衡二叉排序树,命名来源于发明者的首字母。
  • 在二叉排序树基础上增加约束条件:左右子树的高度差最多为 1。
  • 问题:插入和删除时几乎都要旋转,频繁旋转导致性能下降。

红黑树

  • 二叉排序树有不平衡问题,可能左子树很长右子树很短,导致查询性能从log(n)退化成n。
  • AVL树能保证层数平均,但是维护又很麻烦,插入和删除都可能需要大幅调整树结构。
  • 红黑树是一种相对平衡的二叉排序树。
  • 约束条件:
    • 节点赋予红黑颜色。
    • 根节点为黑色。
    • 新插入的节点为红色。
    • 每个红色节点的两个子节点是黑色。
    • 任意节点到叶子节点的所有路径包含相同数目的黑色节点。
  • 特点:
    • 插入时不超过 2 次旋转就可以符合约束条件。
    • 删除时不超过 3 次旋转就可以符合约束条件。
    • 故查询、插入和删除的复杂度都是log(n)。
  • 应用:
    • java 的 hashmap。
    • linux 的进程调度。
    • linux 的多路复用 Epoll。

红黑树插入过程示例:
image

B树

  • B 树是平衡多路查找树。
  • 相比于二叉排序树,B 树增加节点分支数量从而降低深度。
  • 适用场景:对于磁盘存储的数据,较低的深度可以减少 IO 次数。
  • 约束条件:
    • 叶子节点都在同一层。
    • 节点的关键字数是子树个数减 1。
    • 子树的关键字保证左小右大的顺序。
  • 缺点:节点上存储数据,当数据较大时节点的键数会减少,导致层高变高。

B+树

  • 是对B树的改进,目的是降低树深度,容易全表扫描。
  • 与B树在结构上的区别:
    • 只在叶子节点存储数据,非叶子节点只存储索引键。
    • 所有叶子节点之间通过指针串起来形成链表。
  • 与B树在操作上的区别:
    • 插入时会先将数据插入到叶子节点中,然后再调整树结构。
    • 查询时需经过从根到叶子的路径。
  • 应用:数据库索引,如 mysql 的 InnoDB的索引实现。

字典树

  • 定义:一种用于存储和检索字符串集合的字典树。
  • 特点:
    • 利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较。
    • 每个结点代表一个字符,从根到叶子节点形成一个字符串。
  • 应用:词频统计。

基数树

  • 定义:一种压缩的字典树,相比于字典树,如果节点只有一个子节点则会合起来。
  • 对比字典树的优势:更加节省空间,深度更低查找效率更高。
  • 对比字典树的劣势:构造树时需要更多地处理分裂。
  • 应用:路由查找。