![bf0981667e9e250fff5a7a774d88b5d6.png](https://i-blog.csdnimg.cn/blog_migrate/a1aa1553f2fd3a3057f3481d6172e23d.jpeg)
平衡树存储:
![fe6a96ab4abe2ab51e42ebc0366a0b52.png](https://i-blog.csdnimg.cn/blog_migrate/ece48215b3294a27c59e08d013174c5d.png)
size就是节点的个数。
value是节点代表的权值。
权值相同的两个节点被视为一个,num记录折叠数量。
rand是随机数,用来维护平衡树。
son就是两个儿子。
平衡树size更新:
实际操作中,各个变量的值都是不断更新的,size也不例外。
函数体:
![d4616477f16fa1bc6571b8d8347e3504.png](https://i-blog.csdnimg.cn/blog_migrate/2f9e6e5a96c4bcc32de02a033fd2e455.png)
一个节点包括的节点个数用脚也能想到:左儿子size与右儿子size的和,加上这个节点折叠数量。
![da3f6c1ba4cc981fb422b02006f35121.png](https://i-blog.csdnimg.cn/blog_migrate/099a6abfd8b33d71514dc60d2d6c0b7e.png)
完整的平衡树size更新代码:
![b8c8308b6fd7ec4d005f372cb4f216f2.png](https://i-blog.csdnimg.cn/blog_migrate/c79cf64041fda1d4a5fdb9cf072237ec.png)
平衡树插入:
学习完上面的内容,接下来的基本逼死人的操作插入与删除就很简单了:
由于Treap = Tree + Heap
所以平衡树插入与二叉排序树插入差不多
函数体:
![e510a6a87b7dc541eb510f04694a180f.png](https://i-blog.csdnimg.cn/blog_migrate/5a276e33bc71a78c3bd3d0b630a507a6.png)
插入节点总会遇到各种增加码量的情况,需要我们一一判断:
[ 1 ]节点不存在
什么??节点不存在??杀了出题人!
当插入函数用在建树中,这种情况很常见。
没有节点,那我们就开垦一个节点。(水土流失,土地荒漠化请走开)
├ 节点总数加1
├ 新节点size为1
├ 新节点num为1
├ 权值为data
└ 生成rand
→→→崭新的节点!!(不要998,不要98,只要9.8!)
代码实现就是一个简单的模拟:
![c800b11866e9293bac848c871cdceb54.png](https://i-blog.csdnimg.cn/blog_migrate/8a334958e5d040ee55d84c5f32ef7234.jpeg)
[ 2 ]有一个权值为data的节点
那更简单了!!
![b4c55f69289bfe3fa9148bdaad2e7e3e.png](https://i-blog.csdnimg.cn/blog_migrate/a4de6075c876e22b90949b53b94bf392.jpeg)
[ 3 ]寻找子树满足情况一或情况二
去哪棵子树呢??定义一个变量。
![3d5d24cf634de126d1b70a5047baf1ff.png](https://i-blog.csdnimg.cn/blog_migrate/7cd363a2c11a9e1186886f74400c099b.png)
有了明确的方向,就应该坚持走下去:
![6782baa82ea5352fa07141563d8944ee.png](https://i-blog.csdnimg.cn/blog_migrate/33692ab700d6e9726b2420e9a67330bb.png)
随机数判断,随机旋转:
![2970f2a47cd248364e95fed818e41fdb.png](https://i-blog.csdnimg.cn/blog_migrate/251dae580f4454c4a8fc4e7de9ead288.png)
更新size:
pushup(root);
至此,插入操作基本完成。
完整平衡树插入代码:
![58a0cfa3de6a5daf67f5d46a4e067178.png](https://i-blog.csdnimg.cn/blog_migrate/9af8f55f766474b352d7ed9bd68338ff.jpeg)
平衡树旋转:
平衡树旋转不破坏平衡树的性质,也就是说
旋转前:A<B<C<D<E<F
旋转后:A<B<C<D<E<F
完整平衡树旋转代码:
![5f9e7bebaa3fe3319846f338f36824ea.png](https://i-blog.csdnimg.cn/blog_migrate/4ef3fc03e0438477b15ee2d356abf59e.jpeg)
![ae8522289bdaed324b213c99ed815976.png](https://i-blog.csdnimg.cn/blog_migrate/690b3a80c9c9e88c858750d0beba22d6.jpeg)
![1483b0bc07f34ef3d9384489d455bc20.png](https://i-blog.csdnimg.cn/blog_migrate/3c66e49ea8d4e0c0b51fc31d9d8d50d7.jpeg)
![00b083e9166e8ca3279ac2fbe16394c1.png](https://i-blog.csdnimg.cn/blog_migrate/f51ef6b7f6593956f92785f49e7dc68b.jpeg)
![24d49fbc2d6c28aa4f4f25edb0fc996c.png](https://i-blog.csdnimg.cn/blog_migrate/f21349517a0d4a671cb1b2269735c106.jpeg)
博客园:OIer|zythonc
学习C/C++编程知识,提升C/C++编程水平,欢迎关注笔者的学习专栏,一起来加油吧~
C/C++学习笔记zhuanlan.zhihu.com![72a44c24b8a891b55be6ebf5ff4f9bcd.png](https://i-blog.csdnimg.cn/blog_migrate/9b4e478c9bb58a447bf77708f27c5922.jpeg)