平衡树 Splay

先写一篇Splay平衡树的博客吧(其它的还没学QAQ)。

什么是平衡树

首先需要知道二叉查找树,定义为该节点的左子树都比它的值小,右子树都比它的值大。这样有什么好处的?可以发现,中序遍历就是从小到大的顺序。

然后Splay,个人理解,通过将某个节点旋转到根节点来调整这个树的高度,尽量保持平衡。

 如果树是这样的,很显然不平衡,我们需要通过操作让这棵树尽量平衡,也就是使树高尽量小。

最后旋转到类似于下面的形状。

关键操作:

1.旋转

 分为左旋和右旋,要保证旋转完必须还得是一棵二叉查找树。旋转的规律在上面。

void update(int x){
	tree[x].siz = tree[tree[x].ch[0]].siz + tree[tree[x].ch[1]].siz + tree[x].cnt;
    //更新这个点的大小
	return;
}
void rotate(int x){
	int y=tree[x].fa,z=tree[y].fa; //y是x的父亲,z是y的父亲,也就是x的爷爷
	int k = tree[y].ch[1]==x; //判断x是y的左儿子还是右儿子
	tree[z].ch[tree[z].ch[1]==y] = x; //z的儿子给标记成x
	tree[x].fa = z; //x的父亲是z
	tree[y].ch[k] 
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值