12.15_黑马数据结构与算法笔记Java

目录

144 avl树 balance

145 avl树 put

146 avl树 remove

147 红黑树 概述

148 红黑树 put case1-3

149 红黑树 put case4

150 红黑树 remove case0-1

151 红黑树 remove case2

152 红黑树 remove case3

153 红黑树 remove case4

154 红黑树 remove case5

155 红黑树 remove 演示

156 B树 历史

157 B树 特性

158 B树 节点类1

159 B树 节点类2

160 B树 contains

161 B树 put

162 B树 split 分析

163 B树 split 实现

164 B树 split 非叶子和根

165 B树 split 测试

166  B树 put结合split


144 avl树 balance

 新增的时候不需要加=号,删除的时候需要。为了解决以上的例子。

145 avl树 put

昨天做了很多伪递归的演示,遂我们知道,这里return回来的东西就是doPut()这东西的返回值,这个return回来的东西要和树建立连接,因为是在node的左边进行查找,那自自然就是连接node的左手。 

146 avl树 remove

147 红黑树 概述

我们什么时候考虑null值,就是发现,有左孩子却没有右孩子的时候,要把另外一个兄弟也加进来。 

小妙招:

如果叶子节点,就是最下面的这个点如果是黑色的,一定要成对出现,如果是红色的,那一定是对的。 

parent.isLeftChild:父亲是不是爷爷的左孩子。 

 

148 红黑树 put case1-3

149 红黑树 put case4

150 红黑树 remove case0-1

准备工作:

李代桃僵方法:不改变其他东西,只改变5和6的值。这样子可以简化代码。

删除的是两个孩子

删除的是没有孩子或者一个孩子,并且删除的是根节点

151 红黑树 remove case2

删除的是没有孩子,且不是根节点的。

那就让它的父母指向null,然后设置它自己的新父母为null,有利于垃圾回收。这说明没有人引用它了,他就会自动被清理掉。

 删除的是有一个孩子的,且不是根节点的。

倒数第二行的代码,几个连等null的代码的意思是:我让要删除的元素和所有人脱掉关系,因此有助于垃圾回收。

现在要考虑平衡的问题了:

删黑色要考虑平衡问题,删红色不需要 

 

152 红黑树 remove case3

 

后面的再次递归,是将case3变成case4

153 红黑树 remove case4

几个例子

 

154 红黑树 remove case5

155 红黑树 remove 演示

156 B树 历史

157 B树 特性

4有两个孩子,也就是度为2 

关键字数就是key,可以有多个。从孩子数推导到关键字数 

158 B树 节点类1

159 B树 节点类2

怎么去看红色框框?

如图举例子,如果要查找的是18,keys【3】(20)>18,说明在第二行

如果要查找的是30,keys【5】(30)已然超过了第一行,说明在第二行

如果是非叶子的情况,则调用孩子来查找,因为比如说那个序号5,第一行是找不到序号5的,但是第二行是有序号5的。 

160 B树 contains

为什么在B树中,2倍树中节点最小度数-1等于最大key数目

在B树中,2倍树中节点的最小度数-1等于最大key数目是因为B树的定义和性质决定的。

B树是一种多路搜索树,它的每个节点可以包含多个子节点和关键字。在B树中,每个节点的关键字数量要满足一定的条件,即最小度数-1到2倍最小度数-1之间。同时,每个节点的子节点数量比关键字数量多1。

当节点的最小度数为t时,根据B树的性质,每个节点至少包含t-1个关键字和最多2t-1个关键字。而2倍树中的节点的最小度数为2t,因此最小度数-1就等于t-1,最大key数目就等于2t-1。

因此,在B树中,2倍树中节点的最小度数-1等于最大key数目是由B树的定义和性质决定的。

最小度数是啥

在B树中,最小度数是指一个节点中包含的最少子节点数。在B树中,每个节点都包含一个关键字和对应的子节点,最小度数规定了节点中子节点的最少数量。对于一个最小度数为t的B树,每个非根节点必须至少包含t个子节点,而根节点至少包含2个子节点。

root就是一个普通的节点 

161 B树 put

162 B树 split 分析

再举一个例子:

163 B树 split 实现

boolean leaf = true;right.leaf = left.leaf;什么意思?

首先,"boolean leaf = true;" 是一个声明语句,它创建了一个名为leaf的布尔变量,并将其赋值为true。这表示leaf变量是一个布尔类型的变量,它的值为true,即表示为叶子节点。

接着是"right.leaf = left.leaf;" 这是一个赋值语句,它将right节点的leaf属性设置为和left节点的leaf属性相同。这意味着right节点的leaf属性将被设置为和left节点相同的布尔值。这可能是在处理树的数据结构时,用来设置节点的属性,以便在树的遍历或搜索过程中进行判断和处理。

index:在那行,你是第几个。

164 B树 split 非叶子和根

 

第二种情况:根节点

165 B树 split 测试

两种测试方式:

1.debug

2.

166  B树 put结合split

  • 12
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值