红黑树深入学习

一、介绍

红黑树是一种特殊的二叉查找树(特殊在自平衡上),每个节点会存储本节点的颜色,根节点和叶子节点(NIL或NULL,叶子结点不存储数据)是黑色。从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点(确保没有一条路径 会比其他路径长出两倍)。

应用场景:主要用来存储有序的数据,时间复杂度为O(lgn)。Java集合中的TreeSet和TreeMap,C++STL中的set、map以及Linux虚拟内存的管理都是通过红黑树实现

对于频繁插入、删除的场景,红黑树优势明显

二、自平衡实现

左旋:以某个结点为支点(旋转结点),其右子节点变为旋转结点的父结点,右子结点的左子结点变为旋转结点的右子结点,左子结点保持不变

右旋:以某个结点为支点(旋转结点),其左子结点变为旋转结点的父结点,左子节点的右节点变为旋转结点的左子结点

变色:结点的颜色由红变黑或者由黑变红

三、红黑树查找

  • 从根结点开始查找,把根结点设置为当前结点;
  • 若当前结点为空,返回null;
  • 若当前结点不为空,用当前结点的key跟查找key作比较;
  • 若当前结点key等于查找key,那么该key就是查找目标,返回当前结点;
  • 若当前结点key大于查找key,把当前结点的左子结点设置为当前结点,重复步骤2;
  • 若当前结点key小于查找key,把当前结点的右子结点设置为当前结点,重复步骤2;

四、红黑树插入

步骤:①查找插入的位置②插入后自平衡

  • 从根结点开始查找;
  • 若根结点为空,那么插入结点作为根结点,结束。
  • 若根结点不为空,那么把根结点作为当前结点;
  • 若当前结点为null,返回当前结点的父结点,结束。
  • 若当前结点key等于查找key,那么该key所在结点就是插入结点,更新结点的值,结束。
  • 若当前结点key大于查找key,把当前结点的左子结点设置为当前结点,重复步骤4;
  • 若当前结点key小于查找key,把当前结点的右子结点设置为当前结点,重复步骤4;

注意:插入结点的颜色为红色,因为这样不会破坏红黑树的黑色平衡

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值