红黑树的深入理解

二叉树

  • 每个节点最多有两个子节点。
  • 比根节点大的放右边,比根节点小的放左边。

二叉树的问题

二叉树容易导致像一边偏(左偏或者右偏)导致查找性能变差,偏的多了就变成线性查找了。

在此基础上就诞生了红黑树。

红黑树

功能 :将树变的矮矮胖胖的

红黑 只是一个标签,用来适配红黑树的规则(规则规定的是 红和黑)。。元素本身没有特别的地方。利用红黑树的规则进行插入元素可以使树的结构矮矮胖胖。

5 条规则
  • 1 根节点必须为黑(就是这么规定的)
  • 2 节点非红即黑
  • 3 所有的叶子节点,全部都用黑的null填充
  • 4 任意一个节点到其所有的叶子节点之间经过的黑节点相同(重要)
  • 5 红节点的两个子节点为全黑(重要)

插入元素

插入的过程无非一下5种情况

  • 什么都没有,插入的元素即为根节点,直接涂黑即可
  • 只有一个根节点,新添加节点直接涂红即可(规则4)
  • 父节点为黑,不影响,直接插入即可

规则死记硬背,很费劲,清楚规则以后就简单多了
除了以上两种简单情况,多余无非下面 以下几种情况

  • 父和叔叔都为红 我们记为情况1—父叔皆红
  • 在这里插入图片描述
  • 父亲为红叔叔为黑,父亲是祖父的右节点 记为情况2----父红叔黑右
  • 在这里插入图片描述
  • 父亲为红叔叔为黑,父亲是祖父的左节点 记为情况3----父红叔黑左
  • 在这里插入图片描述

解决的操作无非以下几种方式

  • 变色
  • 左旋
  • 右旋

上面三种情况分别对应的解决方式为(对着冲突的地方进行操作)

  • 父叔皆红 ------变色->左旋->右旋->根节点涂黑

  • 父红叔黑右 ------ 左旋->右旋->根节点涂黑

  • 父红叔黑左 ------ 右旋->根节点涂黑

总结

经历了情况1 必然会经历情况2 和情况3 只需要根据对应情况做对应操作即可。。
可见一次插入操作最多只会旋转两次。变色最多也是两次

红黑二叉树的查找,和插入的时间复杂度,因为属于二分查找都为O(logN)

普通的二叉树在最坏的情况下(全偏向一边) 时间复杂度为 O(n)

附上原文地址,,讲的很好。图我也是直接截取过来的
https://www.cnblogs.com/ysocean/p/8004211.html#_label3

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值