![d892f3c603ba36d9a0a7f9d4f42d844c.png](https://img-blog.csdnimg.cn/img_convert/d892f3c603ba36d9a0a7f9d4f42d844c.png)
平衡树存储:
![65d3047422899a6610ddf6ba90cbeb5f.png](https://img-blog.csdnimg.cn/img_convert/65d3047422899a6610ddf6ba90cbeb5f.png)
size就是节点的个数。
value是节点代表的权值。
权值相同的两个节点被视为一个,num记录折叠数量。
rand是随机数,用来维护平衡树。
son就是两个儿子。
平衡树size更新:
实际操作中,各个变量的值都是不断更新的,size也不例外。
函数体:
![5d7a6716db62b4fd49c18354c342cf05.png](https://img-blog.csdnimg.cn/img_convert/5d7a6716db62b4fd49c18354c342cf05.png)
一个节点包括的节点个数用脚也能想到:左儿子size与右儿子size的和,加上这个节点折叠数量。
![05310793ac2fcd60d68f12dc36ae5e5e.png](https://img-blog.csdnimg.cn/img_convert/05310793ac2fcd60d68f12dc36ae5e5e.png)
完整的平衡树size更新代码:
![c7e67bea4bf9e3bc7d674e04dbc20eaf.png](https://img-blog.csdnimg.cn/img_convert/c7e67bea4bf9e3bc7d674e04dbc20eaf.png)
平衡树插入:
学习完上面的内容,接下来的基本逼死人的操作插入与删除就很简单了:
由于Treap = Tree + Heap
所以平衡树插入与二叉排序树插入差不多
函数体:
![8c31fff1dea7cf7f0049fa7127b86231.png](https://img-blog.csdnimg.cn/img_convert/8c31fff1dea7cf7f0049fa7127b86231.png)
插入节点总会遇到各种增加码量的情况,需要我们一一判断:
[ 1 ]节点不存在
什么??节点不存在??杀了出题人!
当插入函数用在建树中,这种情况很常见。
没有节点,那我们就开垦一个节点。(水土流失,土地荒漠化请走开)
├ 节点总数加1
├ 新节点size为1
├ 新节点num为1
├ 权值为data
└ 生成rand
→→→崭新的节点!!(不要998,不要98,只要9.8!)
代码实现就是一个简单的模拟:
![426d6365788a2eccb7f8a9851905228a.png](https://img-blog.csdnimg.cn/img_convert/426d6365788a2eccb7f8a9851905228a.png)
[ 2 ]有一个权值为data的节点
那更简单了!!
![fc9085d0729c98597fac7358de96aac4.png](https://img-blog.csdnimg.cn/img_convert/fc9085d0729c98597fac7358de96aac4.png)
[ 3 ]寻找子树满足情况一或情况二
去哪棵子树呢??定义一个变量。
![b3967d077d92ef7efe5c165a406a9aa7.png](https://img-blog.csdnimg.cn/img_convert/b3967d077d92ef7efe5c165a406a9aa7.png)
有了明确的方向,就应该坚持走下去:
![7bf94907c8578975baa3150415b9b52d.png](https://img-blog.csdnimg.cn/img_convert/7bf94907c8578975baa3150415b9b52d.png)
随机数判断,随机旋转:
![8c9fa08f8e384c6b1aec46afee2d99ee.png](https://img-blog.csdnimg.cn/img_convert/8c9fa08f8e384c6b1aec46afee2d99ee.png)
更新size:
pushup(root);
至此,插入操作基本完成。
完整平衡树插入代码:
![bff00dbb47c7308d79ede06af0081d45.png](https://img-blog.csdnimg.cn/img_convert/bff00dbb47c7308d79ede06af0081d45.png)
平衡树旋转:
平衡树旋转不破坏平衡树的性质,也就是说
旋转前:A
旋转后:A
完整平衡树旋转代码:
![ca761e90526684c5fdbad8ca10e241cb.png](https://img-blog.csdnimg.cn/img_convert/ca761e90526684c5fdbad8ca10e241cb.png)
![80493aa8e39dafbcb5de224d5d1e74cb.png](https://img-blog.csdnimg.cn/img_convert/80493aa8e39dafbcb5de224d5d1e74cb.png)
![0f243eb434a349d6f1334fb9ab07dfc6.png](https://img-blog.csdnimg.cn/img_convert/0f243eb434a349d6f1334fb9ab07dfc6.png)
![4c47ab145cdddf1e2f2a8678e5849336.png](https://img-blog.csdnimg.cn/img_convert/4c47ab145cdddf1e2f2a8678e5849336.png)
![1624e4947541bb605e99db56d0dd21b4.png](https://img-blog.csdnimg.cn/img_convert/1624e4947541bb605e99db56d0dd21b4.png)
博客园:OIer|zythonc
想要在程序员生涯内有更高的成就的话,C/C++就是一个既可以强化思维能力,又可以打好编程基础的编程语言,你想要做软件开发,成为核心程序员的话,学习C/C++的话笔者有一个C/C++的编程俩千人羣(Q艘索:C/C++编程学习13)群,你如果感觉自学C/C++语言有困难的话,有兴趣学习或者了解一下C/C++编程的小伙伴就可以进来交流。