红黑树TreeMap总结

   红黑树是自平衡的二叉查找树,又称二叉B树。它可以在O(logN)时间复杂度内完成查找、增加、删除操作。红黑树是在二叉查找树基础上增加了着色和左右旋转使得红黑树相对平衡, 与AVL树相比,红黑树并不追求所有子树的高度差不超过1,而是保证从根节点到叶子节点的最长路径不超过最短路径的2倍。红黑树通过如下性质实现了自平衡:

1. 节点必须是黑色或红色;

2.根节点必须是黑色;

3.所有NIL节点都是黑色的; NIL即叶子节点下挂的两个虚节点(逻辑意义,不真实存在)

4.一条路径上不能出现相邻的两个红色节点;

5.在任意递归子树内,根节点到叶子节点的所有路径上包含相同数目的黑色节点。

     总结一下,即“有红必有黑,红红不相连”。 上述性质保证了红黑树新增、删除、查找最坏时间复杂度是O(logN),  红黑树的任何旋转都可在3次内完成, 红黑树每次向上回溯的步长是2(即父亲、祖父节点)。

     条件4、5保证了任意节点到叶节点的最长路径不超过最短路径的2倍。 原因如下:当某条路径最短时,必然都由黑色节点组成(条件4)。 当某条路径最长时,必然由红色和黑色节点组成; 性质5要求黑色节点总数相同,最长路径比最短路径多的就是红色节点,而性质4保证了出现红色节点后(父亲和孩子节点必须是黑色),所以红色数量等于黑色节点数量时是理论上的最长路径。 即最长路径和最短路径的区别是红色节点数量的差别

                                                             

      从上图根节点到所有叶子节点的路径是56-55、 56-59-58、 56-59-83-90,  最短路径长度是2,最长路径长度是4 ,正好是2倍,  所以理论上红黑树根节点高度h<=2*log(N+1)。 常规BST操作比如查找、插入、删除的时间复杂度是O(h),  即取决于树的高度h。当我们保证树的高度始终保持在O(logN)时,所有操作的时间复杂度也能保持在O(logN)以内。

      下面看红黑树的左旋、右旋操作步骤,其实挺简单的。 左旋就用右子树替换自己的位置,自己变为原右子节点的左子树,原右节点的左子树变为自己的右子树。右旋就是用左节点替换自己的位置,自己变为原左子节点的右子树,原左节点的右子树变为自己的左子树。 以左旋代码为例说明,摘自TreeMap.java

private void rotateLeft(Entry<K,
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值