红黑树笔记

显而易见,平衡二叉树每次插入删除都极易破坏它的性质,需要左旋右旋来恢复它的性质,这样大大降低了它的性能。而红黑树的出现就是为了不这么复杂。

在了解红黑树之前,我们得先了解2-3-4树,2-3-4树可以帮我们更好了解红黑树。

2-3-4树是一颗满二叉树,其实也可以看作二叉搜索树,因为它的插入也是小了往左边走,大了往右边走,最终在叶子结点插入。2-3-4树中有三种结点:

  • 2结点:该类结点包含一个结点,而且肯定有两个子结点。(如果是叶子结点其实它还有两个空子结点,下面一样道理)
  • 3结点:该类结点包含两个结点,而且肯定有三个子结点。
  • 4结点:该类结点包含三个结点,而且肯定有四个子结点。

总之它大概就长这个样子:

我们重点要说的是它的插入,详细内容可以看看这个视频教程。 它新插入的结点要么成为单独叶子结点也就是2结点,要么会与叶子结点结合,如果和2结点结合就会变为3结点,和3结点结合就会变为4结点,和4结点遇到后,原本4结点中间那个结点就会升到上一级和它的父结点结合,剩余则分为左右两部分。我就用上图举个例子,现在假设我要插入13,很显然它会和(10 11 12)这个4结点相结合。

如上图所示,一开始位于中间的11升上去和(7,9)结合变成了4结点,此时,它有也有四个子节点。原本的(10,11,12)因为11的升天一分为二,那13要和谁结合呢,这取决于数值的大小。 

红黑树其实就是由2-3-4树转换过来的,一棵2-3-4树可能对应多棵红黑树,而一棵红黑树只能转换回去成一棵2-3-4树。 它们的转换关系见下图:

 

 现在来说红黑树是啥。红黑树它具备二叉搜索树的性质,它只有两种结点,黑结点和红结点,而且不会出现连续两个都是红结点,因为它是由2-3-4树转换来的,可以很好理解。它的根结点一定是黑色的,最重要的是,从根结点到每个叶子结点的路径中,黑色结点的数量是一样的。

红黑树的插入其实很简单,跟二叉搜索树一样,它都会在叶子结点处插入,然后它插到谁下面你可以通过红色结点数量来判断此时是和2结点结合了还是和3结点结合了。如果是和3结点结合了是需要旋转再加变颜色的,而和4结点结合会导致中间那个结点上升,可能会导致上层连续旋转。

删除也很简单,待删除结点无非三种情况:

  • 没有子结点:这种情况就是叶子结点啦,直接删掉就好
  • 有一个子结点:这种情况就用子结点替代它原来的位置就好
  • 有两个子结点:这种情况需要去找前驱结点或后继结点来代替它的位置。

在java中的treemap源码实现中,作者是用的后继结点代替删除时的位置,而在这个教学网站中则是用的前驱代替删除位置。删完之后,根据2-3-4树的性质来决定要不要变色或者旋转。

 

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值