浅谈左偏树

关于左偏树这个东西嘛……还是挺简单的。

就是一个merge操作:

int merge(int x, int y){
	//pushdown(x); pushdown(y);   // 这里可以下放标记
    if(!x || !y) return x + y;  //特判一下
    if(sum[x] > sum[y]) swap(x, y);//保持堆的性质
    ch[x][1] = merge(ch[x][1], y);//下面的就是左偏树的精髓所在了,只可会意
    if(dis[ch[x][0]] < dis[ch[x][1]]) swap(ch[x][0], ch[x][1]); //就是这个奇奇怪怪的操作可以保证堆为log层
    dis[x] = dis[ch[x][1]] + 1;
    return x;
}

没了? 没了

就这个merge操作可以完成插入、删除还有合并(merge本来就是合并嘛……)

posted @ 2018-09-24 17:22  lahlah  阅读(24)  评论(0编辑  收藏  举报