[备份] 用Java手写红黑树

介绍

二叉搜索树

二叉树:树的每个节点最多只能有两个子节点

二叉搜索树:

参考图片 img

查找:搜索值小于当前节点搜左子树,大于当前节点搜右子树,等于表示搜到 插入:类似查找,直到左子树或右子树为空时认为找到了插入位置

遍历:

参考图片 img

最值:

删除:

二分查找

二分查找:数组有序情况下,对半查,参考下图 img

缺点:必须是有序的,而且是数组,不可以是链表

可以看出,二叉搜索树和二分查找有一定的相似度

AVL树

二叉搜索树存在一种极端情况,这种情况下会退化为一个有序链表 img

由于退化成链表后搜索效率过低,需要设计一种树,在插入元素的时候自动调整两边平衡,保持高查询性能。这里暂不分析AVL树,本节重点是红黑树

AVL树特点:

  1. 具有二叉树全部特性
  2. 左子树和右子树高度差最多是1
  3. 插入或删除时,会涉及到左旋和右旋操作

img

虽然AVL树解决了二叉搜索树的极端情况,但是由于高度差限制过于严格,导致效率过低

于是引出了红黑树的概念

基础

性质

红黑树具有以下的性质,如果满足那么这棵树就是趋于平衡状态的:

img

自平衡

  1. 变色:节点颜色红黑变化
  2. 左旋:某节点右子节点变成父节点,右子节点的左节点变为它的右节点,左子节点保持不变 img
  3. 右旋:某节点左子节点变成父节点,左子节点的右节点变为它的左节点,右子节点保持不变 img

实现

红黑树的插入等操作会涉及到多种情况,暂不分析,直接上代码,在代码中分析

树节点

 

左旋实现

 

右旋实现

 

插入

 

恢复平衡