红黑树概述

树(tee)是一种抽象数据类型(ADT),用来模拟具有树状结构性质的数据集合。

  • 它是由n (n>D)个有限节点通过连接它们的边组成一个具有层次关系的集合。把它叫做"树"是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。
  • 树有很多种,向上面的一个节点有多余两个的子节点的树,称为多路树,而每个节点最多只能有两个子节点的一种形式称为二叉树。
  • 各部分概念 :
    1.路径:顺着节点的边从一个节点走到另一个节点,所经过的节点的顺序排列就称为"路径"。
    2.根:树顶端的节点称为根。一棵树只有一个根,如果要把一个节点和边的集合称为树,那么从根到其他任何一个节点那必须有且只有一条路径。A是根节点。
    3.父节点:若一个节点含有子节点,则这个节点称为其子节点的父节点
    4.子节点:一个节点含有的子树的节点称为该节点的子节点;F、G是C节点的子节点。
    5.兄弟节点:具有相同父节点的节点互称为兄弟节点; F、G节点互为兄弟节点。
    6.叶节点:没有子节点的节点称为叶节点,也叫叶子节点,比如上图的H、E、F、G都是叶子节点。
    7.子树:每个节点都可以作为子树的根,它和它所有的子节点、子节点的子节点等都包含在子树中。
    8.节点的层次:从根开始定义,根为第一层,根的子节点为第二层,以此类推。
    9.深度:对于任意节点n,n的深度为从根到n的唯一路径长,根的深度为0;(从上往下看)
    10.高度:对于任意节点n ,n的高度为从n到一片树叶的最长路径长,所有树叶的高度为0;(从下往上石)

二叉搜索树-查找节点:
查找某个节点,我们必须从根节点开始查找。

  • 查找值比当前节点值大,则搜索右子树:
  • 查找值等于当前节点值,停止搜索(终止条件) ;
  • 查找值小于当前节点值,则搜索左子树:

二叉搜索树-插入节点:

  • 要插入节点,必须先找到插入的位置。与查找操作相似,由于二叉搜索树的特殊性,待插入的节点也需要从根节点开始进行比较,小于根节点则与根节点左子树比较,反之则与右子树比较,直到左子树为空或右子树为空,则插入到相应为空的位置。

二叉搜索树-遍历节点:
遍历树是根据一种特定的顺序访问树的每一 个节点。 比较常用的有前序遍历,中序遍历和后序遍历。二叉搜索树最常用的是中序遍历。

  • 中序遍历: 左子树---->根节点---->右子树
  • 前序遍历:根节点---->左子树---->右子树
  • 后序遍历:左子树---->右子树---->根节点

二叉搜索树-查找最大值和最小值

  • 要找最小值,先找根的左节点,然后一直找这个左节点的左节点,直到找到没有左节点的节点,那么这个节点就是最小值。同理要找最大值,一直找根节点的右节点,直到没有右节点,则就是最大值。

二叉搜索树-删除节点:

  • 删除节点是二叉搜索树中最复杂的操作,删除的节点有三种情况,前两种比较简单,但是第三种却很复杂。
    1、该节点是叶节点(没有子节点)
    2、该节点有一个子节点
    3、该节点有两个子节点

删除没有子节点的节点

  • 要删除叶节点,只需要改变该节点的父节点引用该节点的值,即将其引用改为null即可。

删除有一个子节点的节点

  • 删除有一个子节点的节点,我们只需要将其父节点原本指向该节点的引用,改为指向该节点的子节点即可。

删除有两个子节点的节点

  • 在Node类中增加一个标识字段isDelete ,当该字段为true时,表示该节点已经删除,反之则没有删除。这样删除节点就不会改变树的结构了。但查询时需要判断一下节点是否已被删除。

红黑树的性质 :

  • 每个节点要么是黑色,要么是红色。
  • 根节点是黑色。
  • 每个叶子节点(NIL)是黑色。
  • 每个红色节点的两个子节点一定都是黑色。不能有两个红色节点相连。
  • 任意一节点到每个叶子节点的路径都包含数量相同的黑结点。俗称:黑高!
  • 如果一个节点存在黑子节点,那么该结点肯定有两个子节点

红黑树并不是一个完美平衡二叉查找树,从图上可以看到,根结点P的左子树显然比右子树高,但左子树和右子树的黑结点的层数是相等的,也即任意一个结点到到每个叶子结点的路径都包含数量相同的黑结点(性质5)。所以我们叫红黑树这种平衡为黑色完美平衡。

  • 插入操作包括两部分工作:
    1.查找插入的位置
    2.插入后自平衡
  • 注意:插入节点,必须为红色。如果插入结点是黑色,那么插入位置所在的子树黑色结点总是多1,必须做自平衡。

红黑树插入节点情景分析

  • 直接把插入结点作为根结点。
  • 插入结点的Key已存在
    更新当前节点的值,为插入节点的值
  • 插入结点的父结点为黑结点
    由于插入的结点是红色的,当插入结点的黑色时,并不会影响红黑树的平衡,直接插入即可,无需做自平衡。
  • 新插入节点,为其父节点的左子节点(RL红色情况)
    1.对P进行右旋
    2.将P设置为当前节点,得到RR红色情况
    3.按照RR红色情况处理(1.变颜色2.左旋PP)
  • 新插入节点,为其父节点的右子节点(RR红色情况)
    1.变颜色:将P设置为黑色,将PP设置为红色
    2.对PP节点进行左旋
  • 新插入节点,为其父节点的右子节点(LR红色情况):
    1.对P进行左旋
    2.将P设置为当前节点,得到LL红色情况
    3.按照LL红色情况处理(变颜色/右旋PP)
  • 新插入节点,为其父节点的左子节点(LL红色情况)
    1.变颜色:将P设置为黑色,将PP设置为红色
    2.对PP节点进行右旋
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值