关于红黑树插入过程的正确描述

前言

鉴于网上其它教程中对于红黑树的插入操作的表述并不十分清楚准确全面(只表述了在左边的操作情况),所以本文主要是对插入过程进行完整 介绍。参见第3节。

本文对于红黑树的定义、概念、性质、以及操作过程的图形化表述等内容的叙述较为简略,请参考官方定义或其他教程。

1. 红黑树的基础概念

R-B Tree,全称是Red-Black Tree,又称为“红黑树”,它一种特殊的二叉查找树。红黑树的每个节点上都有存储位表示节点的颜色,可以是红(Red)或黑(Black)。

红黑树的特性:

  1. 每个节点或者是黑色,或者是红色。
  2. 根节点是黑色。
  3. 每个叶子节点(NIL)是黑色。 [注意:这里叶子节点,是指为空(NIL或NULL)的叶子节点!]
  4. 如果一个节点是红色的,则它的子节点必须是黑色的。
  5. 从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点。

注意:

  1. “特性3” 中的叶子节点,是只为空(NIL或null)的节点。
  2. “特性5” 确保没有一条路径会比其他路径长出俩倍。因而,红黑树是相对是接近平衡的二叉树。

2. 红黑树的基础动作

旋转包括两种:左旋 和 右旋。

  1. 左旋是指“把当前节点变为一个左节点”
  2. 右旋是指“把当前节点变为一个右节点”

3. 红黑树插入过程的正确描述

每个新建的节点都按照二分插入被插入到正确的位置上,并且初始化为红色。然后按照以下情况进行调整。

  1. 插入节点为根节点
    直接把插入节点涂为黑色即可。

  2. 插入节点的父节点为黑色
    不需要任何调整。

  3. 插入节点的父节点为红色
    需要调整(两个红色节点不能相接,而现在同为红色,所以需要调整),下面分情况讨论。

    3.1 叔叔节点为红色

     把父节点和叔叔节点变成黑色,祖父节点变为红色,然后递归处理祖父节点。
    

    3.2 叔叔节点为黑色

     此时又要分情况处理,如下。
    
     3.2.1 插入节点、父节点和祖父节点,在同一直线(插入节点是父节点的左孩子,父节点是祖父节点的左孩子;或者都是右孩子)  
           交换父节点和祖父节点的颜色,然后祖父节点往反方向旋转(插入节点和父节点是左孩子,则祖父节点右旋,反正左旋)。
    
     3.2.2 插入节点、父节点和祖父节点,不在同一直线
           先旋转父节点,使三点同线,然后参考3.2.1
    

附:

[1] 红黑树(一)之 原理和算法详细介绍(本文缺少的部分可以参照此文,有图文)(但是此文中,红黑树的初始化有误)
[2] 红黑树(删除)(很详细,有图文)
[3] 在线生成红黑树(含变形步骤)(在线生成红黑树的工具,很棒)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值