add_hold 自下而上和hold实质上是类似的,就给出伪代码
add_hold(x);
if x=1 {exit} (如果是根节点就退出)
p<- [x/2] ([X] 高斯记号,值为 整数N ,N满足 N<=X 且 N+1>X 。 当X>=0 时 相当于取整数部分)
if mod(x,2)=1 {l<-x r<-x+1} else {l<-x-1 r<-x} (这里我在程序中用了其他写法,其实是等价的)
if r>len
{
if tree[l]<tree[p] {swap(l,p) add_hold(p)}
}
if (tree[l]<tree[p]) or (tree[r]<tree[p])
{
if tree[l]<tree[r] {swap(l,p)} else {swap(r,p)}
add_hold(p)
}