comet wannafly summer camp 數據結構篇之堆

二叉堆數組

1、堆的性質:根節點的權值大於等於子樹中任意節點的權值;除最底層以外每一層都被添滿—徹底二叉樹。spa

 

2、堆的操做:指針

1.獲取最大值;直接把堆頂拿出來就是堆的最大值。code

//heap[1];

 

 

2.新插入一個節點;將新增的節點放在n+1位,而後不斷和父親進行對比,若是不知足堆的性質就進行替換,不然就是一個符合標準的堆。【O(log n)】blog

 

void swap(int &x,int &y){int t=x;x=y;y=t;}
int heap[M];//定義堆數組
int siz;//堆大小 
void push(int x){//插入x
    heap[++siz]=x;
    now=siz;
    //插入到堆底 
    while(now!=1){//直到訪問到堆頂 
        ll nxt=now>>1;//找到它的父親 
        if(heap[nxt]>heap[now])swap(heap[nxt],heap[now]);//父親比它大,那就交換 
        else break;//若是比它父親小,那就表明着插入完成了 
        now=nxt;//交換 
    }
    return; 
}

 

 

 

3.刪除最大值;找要刪除的根的兩個兒子中較大的那個,用根進行交換,不斷將兩個兒子中較大的那個換上一層,直到根節點1號點沉底,而後刪除。可能最後一層會出現刪除後不知足徹底二叉樹的性質,那個就將最後一個節點插入到沉底刪除的位置。 class

 

void pop(){
    swap(heap[siz],heap[1]);siz--;//交換堆頂和堆底,而後直接彈掉堆底 
    int now=1;
    while((now<<1)<=siz){//對該節點進行向下交換的操做 
        int nxt=now<<1;//找出當前節點的左兒子 
        if(nxt+1<=siz&&heap[nxt+1]<heap[nxt])nxt++;//看看是要左兒子仍是右兒子跟它換 
        if(heap[nxt]<heap[now])swap(heap[now],heap[nxt]);//若是不符合堆性質就換 
        else break;//不然就完成了 
        now=nxt;//往下一層繼續向下交換 
    }
}

 

 

 

4.新建一個堆(一個一個插入)二叉樹

3、寫法di

(寫法自由,任何能夠實現樹形結構的寫法均可以,例如數組模擬、指針)while

通常用數組模擬,即下標爲x的節點的子樹爲2x和2x+1;co

相關文章
相關標籤/搜索