之前在查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