平衡二叉树总结四:替罪羊树(scapegoat tree)

替罪羊树是一种简洁的平衡二叉搜索树,平衡条件为左右子树大小小于根节点的alpha倍。主要操作包括拉平和重构:拉平将不平衡树转换为链表,重构通过选取链表中点重建平衡树。插入和删除操作遵循二叉搜索树规则,删除采用lazy删除策略。理论性能为平均O(log(n)),但实际重构可能较频繁。
摘要由CSDN通过智能技术生成

  之前在查treap树的时候,偶然在知乎看到一篇比treap树还简单的替罪羊树的介绍,传送门:https://zhuanlan.zhihu.com/p/21263304,大神还是写的很好的,有兴趣的可以去看下,当然也可以看我的总结。

一 、平衡条件

  左子树大小 < alpha * 根大小 并且 右子树大小 < alpha * 根大小

 二、 替罪羊树总结起来就两个操作:

  1.拉平,当树不满足平衡条件时,把树伸展成链表。

  2.重构,递归的选取链表的中点作为根节点重建平衡树,这样得到的几乎是完美的平衡二叉树。

三、基本操作

  0.结构

 

struct scapegoat{
  scapegoat* left;
  scapegoat* right;
  int val,size;
  bool real;
  scapegoat(int v,int s,bool r):val(v),size(s),real(r){left = right = NULL;}
};


  1.插入

  先正常的插入到二叉搜索树中,再回溯的过程中,判断是否违背了平衡条件,如果违背了,拉平并重构该树。

tree insert(tree t,int val){
  if(t==NULL){
    t = new scapegoat(val,1,1);
    return t;
  }
  bool r = 0;(t->size)++;
  if(val > t->va
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值