上个笔记学平衡二叉树的算法,书中详解两种Treap和Splay,本片讲Treap树
![](https://i-blog.csdnimg.cn/blog_migrate/0630b069a307dd1a38af3b7cb7e8753f.png)
![](https://i-blog.csdnimg.cn/blog_migrate/ee296fd6bc44e4a53c72b632413e872c.png)
![](https://i-blog.csdnimg.cn/blog_migrate/ed4f6ba54bb3b45eba95fc0560d8418c.png)
这里的旋转思路:
①左旋:先看初始的树,这个按照搜索树的方式进行建树(任何一个节点的左节点小于它,右节点大于它),那么对于左旋这个操作的意思就是将k的层次向左边提升一个层次,对于原树是第二层,向左提升就是到了根节点这一层。接着看k,k原来是o的右节点,也就是说k>o那么,当k左旋后,o变成了k的左节点(o<k),a原先是o的左节点,所以也保持不变。b原先是k的右节点,保持不变。再看x,由于是个二叉树,当k变成根节点后,左右节点发生改变,且只有两个节点,那么x的位置就有些许尴尬。看原来的树,x是k的左节点,那么但是o的右节点,即o<x<k,那么当k为根节点的时候,x定然在k的左子树上,由于x>o所以x在o的有节点上。由此完成左旋。
②右旋:右旋的方式和左旋类似,都是通过观察原来的树进行判断新树中节点的位置。
由此可以得出结论:
左旋就是将k节点的左子树放到k根节点的右子树上,其余不变。右旋就是将k的右子树放到k的根节点的左子树上。
![](https://i-blog.csdnimg.cn/blog_migrate/5544d7b4d118d727b3822e4571f84c4c.png)
![](https://i-blog.csdnimg.cn/blog_migrate/c7c6709c0ca0e36fb112c548df421547.png)
Splay树
![](https://i-blog.csdnimg.cn/blog_migrate/fd056e39e7a77bce43e775b9390b0402.png)
![](https://i-blog.csdnimg.cn/blog_migrate/4739e59e72479ed639c10d6fe33214fa.png)
![](https://i-blog.csdnimg.cn/blog_migrate/e98cd5d7e05650271ca66edf67dd347f.png)
![](https://i-blog.csdnimg.cn/blog_migrate/6ed49c1abee75b854b4b41acf9d0198b.png)