谈谈你对红黑树的理解

在谈红黑树之前,先来说一说二叉搜索树以及平衡二叉树,因为平衡二叉树是为了弥补二叉搜索树而发明出来的,而红黑树又是为了弥补平衡二叉树。

1、二叉搜索树

二叉搜索树比较简单,它是一棵二叉树,而且满足这样一个性质:对于树上的每一个节点,它左子树上的节点的值都比它小,而右子树上的节点的值都比它大。如下,就是一棵二叉搜索树:

当我们需要往一棵二叉搜索树中插入节点时,只需要从根节点开始,依次比较,若比根节点小,则向左走,继续和左子节点比较,反之继续和右子节点比较,以此类推。这样的操作其实就和二分差不多,在节点值分布均匀的情况下,也就是树的结构如上所示时,查找的时间复杂度为O(logN),因为二叉搜索树的查询完全复杂度依赖于树的深度。所以,它有一个很大的缺陷,就是可能出现如下情况:

我们每次插入的节点都比最小值要小,于是最终所有的节点就连成了一条链,此时深度为N,查找的时间复杂度就是O(N)了。为了解决这个问题,于是又有了平衡二叉树。

2、平衡二叉树

平衡二叉树也是一棵二叉搜索树,但是它还有一个性质,就是这棵树上的每一个节点,其左子树和右子树的高度差都不超过一。比如图一中的二叉树,它就时一棵平衡二叉树,而下面这张图中的树就不是平衡二叉树,因为节点9和节点5都不平衡,它们的左右子树的高度差都是2

当发生不平衡的情况时,可以通过左旋和右旋的方式,在不改变二叉搜索树的性质的前提下,将树调整为平衡状态,这就是平衡二叉树。

3、红黑树

有了二叉搜索树和平衡二叉树,为什么还要红黑树。

这个问题是一个面试题,下面我就来简单叙述一下。首先,二叉搜索树在极端情况下会变成一个链表,从而导致查询的时间复杂度大大提高,变成线性复杂度,而平衡二叉树正是为了解决这个问题才被发明出来。但是,平衡二叉树也有一定的局限。对于平衡二叉树来说,每个节点的子树的高度差不能超过1,一旦出现违反的情况,就需要进行左旋或者右旋操作,从而调整二叉树的高度。但是,在插入和删除节点的过程中,平衡度超过1是经常发生的事情,这也就导致了调整操作频繁地发生,从而提高时间复杂度。也就是说,这种追求绝对平衡的行为,并不是一个好的做法。

红黑树的出现正是为了解决平衡二叉树的问题,它是平衡二叉树的变形,或者说升级。红黑树并不追求绝对的平衡,它实现的是近似的平衡,这样破坏规则导致需要调整的情况就会大大减少,而且每次也只需要少量的调整即可恢复。也就是说,他在平衡和效率之间做了一个折中。而且统计发现,这种折中对查找的效率并没有多大的降低,这也就导致了红黑树在大多数情况下要优于平衡二叉树。而红黑树的这种折中,依靠的就是它五条性质,或者说五条约束来实现。

五大性质:

  1. 树中的所有节点,要么是红色,要么是黑色;
  2. 树的根节点是黑色;
  3. 树中的叶子节点是黑色;(注意:这里的叶子节点不是指没有子节点的节点,而是指的空节点,比如某个节点没有左子节点,那这个不存在的左子节点其实就是这里说的叶子节点)
  4. 红色节点的子节点一定是黑色,也就是说没有两个连在一起的红色节点;
  5. 每个节点到任意一个叶子节点,经过的黑色节点数量是相等的;

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值