[[树]]
上滤
上滤操作针对的是堆大根堆、小根堆进行单节点插入时候的行为,因为插入点位位于数组末端,所以要向上过滤,确保满足相应堆的性质。
下滤
下滤是针对一个尚不具有大根、小根堆性质的堆使之具有相应性质时候的操作。(优先队列中节点的弹出、大小根堆的建立)。
两种操作的思路都类似,即仅在程序中处理节点的移动,并且确定节点存放位置,最后将值赋予该节点。 判断节点位置的条件为:
cpp
x = H->Data(p);//root node
for(parent = p;parent*2<=H->size;parent = child){
child = parent * 2;//enter son node
if((child!=H->size) && (H->Data[child]<H->Data[child+1])){
child++;
}
if(x >= H->Data[child]) break;//如果x大于等于两个子节点,那么x可以作为他们的根节点
else{
H->Data[parent]=H->Data[child];//下滤
}
H->Data[parent] = X;
}