左偏树,顾名思义,就是向左边偏的树。
偏,是相对于树的距离而言;距离,是一个节点到最近叶子节点的距离。
左边的距离大于右边的距离。
这个树满足堆的性质,左右节点的权值都小于/大于根节点的权值。
具体构造方法:
(大根堆)
合并两个左偏树,首先找出权值大的那颗子树,将小的那一颗和大的的右子树合并(左偏性质)。
递归进行处理。
回溯的时候,更新距离,处理左右子树大小。
int merge(int x, int y){//大根堆
if(!x) return y;
if(!y) return x;
if(v[y] > v[x]) swap(x, y);
r[x] = merge(r[x], y);
if(dis[r[x]] > dis[l[x]]) swap(l[x], r[x]);
if(!r[x]) dis[x] = 0;
else dis[x] = dis[r[x]] + 1;
return x;
}