c++ data不明确_C/C++学习笔记:算法知识之平衡树学习笔记,收藏一波吧!

bf0981667e9e250fff5a7a774d88b5d6.png

平衡树存储:

fe6a96ab4abe2ab51e42ebc0366a0b52.png

size就是节点的个数。

value是节点代表的权值。

权值相同的两个节点被视为一个,num记录折叠数量。

rand是随机数,用来维护平衡树。

son就是两个儿子。

平衡树size更新:

实际操作中,各个变量的值都是不断更新的,size也不例外。

函数体:

d4616477f16fa1bc6571b8d8347e3504.png

一个节点包括的节点个数用脚也能想到:左儿子size与右儿子size的和,加上这个节点折叠数量。

da3f6c1ba4cc981fb422b02006f35121.png

完整的平衡树size更新代码:

b8c8308b6fd7ec4d005f372cb4f216f2.png

平衡树插入:

学习完上面的内容,接下来的基本逼死人的操作插入与删除就很简单了:

由于Treap = Tree + Heap

所以平衡树插入与二叉排序树插入差不多

函数体:

e510a6a87b7dc541eb510f04694a180f.png

插入节点总会遇到各种增加码量的情况,需要我们一一判断:

[ 1 ]节点不存在

什么??节点不存在??杀了出题人!

当插入函数用在建树中,这种情况很常见。

没有节点,那我们就开垦一个节点。(水土流失,土地荒漠化请走开)

├ 节点总数加1

├ 新节点size为1

├ 新节点num为1

├ 权值为data

└ 生成rand

→→→崭新的节点!!(不要998,不要98,只要9.8!)

代码实现就是一个简单的模拟:

c800b11866e9293bac848c871cdceb54.png

[ 2 ]有一个权值为data的节点

那更简单了!!

b4c55f69289bfe3fa9148bdaad2e7e3e.png

[ 3 ]寻找子树满足情况一或情况二

去哪棵子树呢??定义一个变量。

3d5d24cf634de126d1b70a5047baf1ff.png

有了明确的方向,就应该坚持走下去:

6782baa82ea5352fa07141563d8944ee.png

随机数判断,随机旋转:

2970f2a47cd248364e95fed818e41fdb.png

更新size:

pushup(root);

至此,插入操作基本完成。

完整平衡树插入代码:

58a0cfa3de6a5daf67f5d46a4e067178.png

平衡树旋转:

平衡树旋转不破坏平衡树的性质,也就是说

旋转前:A<B<C<D<E<F

旋转后:A<B<C<D<E<F

完整平衡树旋转代码:

5f9e7bebaa3fe3319846f338f36824ea.png

ae8522289bdaed324b213c99ed815976.png

1483b0bc07f34ef3d9384489d455bc20.png

00b083e9166e8ca3279ac2fbe16394c1.png

24d49fbc2d6c28aa4f4f25edb0fc996c.png

博客园:OIer|zythonc

学习C/C++编程知识,提升C/C++编程水平,欢迎关注笔者的学习专栏,一起来加油吧~

C/C++学习笔记​zhuanlan.zhihu.com
72a44c24b8a891b55be6ebf5ff4f9bcd.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值