红黑树学习

一,红黑树定义:

1,根节点是黑色的

2,每个叶子节点都是黑色的空节点null,也就是说叶子节点不存储数据

3,任何相邻的(父子)节点都不能同时为红色,也就是说红色节点是被黑色节点隔开

4,每个节点,从该节点到达叶子节点的所有路径,都会包含相同数目的黑色节点。

 

满足二叉搜索树定义(左节点永远比根节点小,右节点比根节点大),也基本满足二叉平衡树(任何节点左右节点的高度差绝对值不能超过1);

二、调整红黑树:左旋,右旋,可以根据二叉搜索树定义调整,就知道左右旋转节点该怎么放了。

红黑树的插入和删除:

插入的子节点必须是红色的。插入的节点都放在叶子上,当插入删除节点导致红黑树被打破时,需要涉及左右旋转及改变颜色使得红黑树再成立。

1,所以当插入的父节点是黑色时直接插入即可不需要做调整,对红黑树的定义不影响。

2,当空树插入红色时,直接改变颜色即可。

3,当插入的父节点是红色的,且叔父节点(父亲的兄弟)是红色的。

注意图中空白就是黑色节点。

则首先吧父节点和叔父节点变黑,把爷爷节点改变成红色,如果需要,需要把爷爷节点再当成新插入的红色继续向上调整。若调整结果根节点变为了红色,则最终还需要将根变为黑色

4,当插入的父节点是红色的,且叔父节点(父亲的兄弟)是黑色的。

如上图:

若是左左插入(即是爷爷的在左儿子的左节点插入),首先对爷爷节点右旋,然后原来的爷爷和父节点交换颜色。

若是左右插入,首先对父节点p左旋,然后再执行左左插入;

如上图:

若是右右插入,左旋爷爷节点g,交换q和p的颜色。

若是右左插入,首先对父节点p右旋,然后再执行右右插入;

如例:依次插入10,70,32,34,13,56,21,

 

三、删除

1,删除没有叶子节点。

1.1若删除的节点本身就是红色的,则直接删除即可

1.2若删除的是黑色节点,需要调整,如下图

1.2.1若删除的是左节点,且兄弟是红色的,且兄弟无子节点。删除后,首先将兄弟设为变黑,兄弟左孩子设为变红,最后将父节点左旋。

1.2.2若删除的是左节点,且兄弟是黑色的,且兄弟无子节点。删除后,将兄弟置为红色。若父节点依然是红色需继续向上调整。

1.2.3若删除的是左节点,且兄弟是黑色的,且有一个右叶子节点。删除后,父节点颜色付给兄弟,将父节点及兄弟节点的右孩子都设为黑色,在对父节点进行左旋。

1.2.4若删除的是左节点,且兄弟是黑色的,且有一个左子节点。删除后,将兄弟节点置为红色,将兄弟的左孩子设置为黑色,对兄弟节点右旋,回到叶子节点是右的情况。

1.2.5若删除的是左节点,且兄弟是黑色的,且有两个子节点。将父节点颜色付给兄弟节点,然后将兄弟的右孩子设为黑色,将父节点设为黑色,最后对父节点左旋。

1.2.6.若删除的是右节点,且。。。。同理1.2.1,1.2.2,1.2.3,1.2.4,1.2.5,像镜子一样。如下图

2,删除有一个叶子节点

设父节点为p,子节点叫s

ps值进行交换,就转为了删除没有叶子节点的第一种情况,执行1.1或1.2即可。

3,删除有两个叶子节点

将要删除的节点和后继节点交换,然后就可能变成了第一种或第二种情况了。

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值