Skip to content

[[树]]


上滤

上滤操作针对的是堆大根堆、小根堆进行单节点插入时候的行为,因为插入点位位于数组末端,所以要向上过滤,确保满足相应堆的性质。

下滤

下滤是针对一个尚不具有大根、小根堆性质的堆使之具有相应性质时候的操作。(优先队列中节点的弹出、大小根堆的建立)。

两种操作的思路都类似,即仅在程序中处理节点的移动,并且确定节点存放位置,最后将值赋予该节点。 判断节点位置的条件为:

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;
}