2019-03-24二叉堆

二叉堆是一種特殊的堆案站,二叉堆是完全二元樹(二叉樹)或者是近似完全二元樹(二叉樹)涎嚼。二叉堆有兩種:最大堆最小堆碴巾。最大堆:父結(jié)點的鍵值總是大于或等于任何一個子節(jié)點的鍵值特愿;最小堆:父結(jié)點的鍵值總是小于或等于任何一個子節(jié)點的鍵值。

Snipaste_2019-03-24_19-23-36.png

堆的結(jié)構(gòu)

package heap;

public class MaxHeap<E extends Comparable<E>> {

    private Array<E> data;

    public MaxHeap(int capacity){
        data = new Array<>(capacity);
    }

    public MaxHeap(){
        data = new Array<>();
    }

    // 返回堆中的元素個數(shù)
    public int size(){
        return data.getSize();
    }

    // 返回一個布爾值, 表示堆中是否為空
    public boolean isEmpty(){
        return data.isEmpty();
    }

    // 返回完全二叉樹的數(shù)組表示中(從0開始)光酣,一個索引所表示的元素的父親節(jié)點的索引
    private int parent(int index){

        if(index == 0)
            throw new IllegalArgumentException("index-0 doesn't have parent.");
        return (index-1)/2;
    }

    // 返回完全二叉樹的數(shù)組表示中疏遏,一個索引所表示的元素的左孩子節(jié)點的索引
    private int leftChild(int index){
        return index * 2 +1;
    }

    // 返回完全二叉樹的數(shù)組表示中,一個索引所表示的元素的右孩子節(jié)點的索引
    private int rightChild(int index){
        return index * 2 + 2;
    }

    

}

向堆中添加元素

//向堆中添加元素
    public void add(E e) {
        data.addLast(e);
        siftUp(data.getSize() - 1);
    }

    private void siftUp(int k) {
        //判斷添加的元素跟父親節(jié)點的大小比較救军,大于父親節(jié)點便和父親節(jié)點交換
        while (k > 0 && data.get(parent(k)).compareTo(data.get(k)) < 0) {
            data.swap(k, parent(k));
            k = parent(k);
        }
    }

取出堆中的最大元素

// 看堆中的最大元素
    public E findMax() {
        if (data.getSize() == 0)
            throw new IllegalArgumentException("Can not findMax when heap is empty.");
        return data.get(0);
    }

    // 取出堆中最大元素
    public E extractMax() {
        E ret = findMax();

        //第一個和最后一個元素交換位置
        data.swap(0, data.getSize() - 1);
        //刪除第一個元素
        data.removeLast();
        return ret;
    }

    //把交換后的第一個元素下沉(比較左右節(jié)點)

    private void siftDown(int k) {

        while(leftChild(k) < data.getSize()){

            //尋找出左右孩子出的最大值跟k值交換
            int j = leftChild(k); // 在此輪循環(huán)中,data[k]和data[j]交換位置
            if( j + 1 < data.getSize() &&
                    data.get(j + 1).compareTo(data.get(j)) > 0 )
                j++;

            // data[j] 是 leftChild 和 rightChild 中的最大值


            if(data.get(k).compareTo(data.get(j)) >= 0 )
                break;

            data.swap(k, j);
            k = j;
        }

    }

    // 取出堆中的最大元素财异,并且替換成元素e
    public E replace(E e){

        E ret = findMax();
        data.set(0, e);
        siftDown(0);
        return ret;
    }
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市唱遭,隨后出現(xiàn)的幾起案子戳寸,更是在濱河造成了極大的恐慌,老刑警劉巖拷泽,帶你破解...
    沈念sama閱讀 222,000評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件疫鹊,死亡現(xiàn)場離奇詭異,居然都是意外死亡司致,警方通過查閱死者的電腦和手機拆吆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蚌吸,“玉大人锈拨,你說我怎么就攤上這事「耄” “怎么了?”我有些...
    開封第一講書人閱讀 168,561評論 0 360
  • 文/不壞的土叔 我叫張陵娄昆,是天一觀的道長佩微。 經(jīng)常有香客問我,道長萌焰,這世上最難降的妖魔是什么哺眯? 我笑而不...
    開封第一講書人閱讀 59,782評論 1 298
  • 正文 為了忘掉前任,我火速辦了婚禮扒俯,結(jié)果婚禮上奶卓,老公的妹妹穿的比我還像新娘。我一直安慰自己撼玄,他們只是感情好夺姑,可當(dāng)我...
    茶點故事閱讀 68,798評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著掌猛,像睡著了一般盏浙。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,394評論 1 310
  • 那天废膘,我揣著相機與錄音竹海,去河邊找鬼。 笑死丐黄,一個胖子當(dāng)著我的面吹牛斋配,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播灌闺,決...
    沈念sama閱讀 40,952評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼许起,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了菩鲜?” 一聲冷哼從身側(cè)響起园细,我...
    開封第一講書人閱讀 39,852評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎接校,沒想到半個月后猛频,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,409評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡蛛勉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,483評論 3 341
  • 正文 我和宋清朗相戀三年鹿寻,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片诽凌。...
    茶點故事閱讀 40,615評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡毡熏,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出侣诵,到底是詐尸還是另有隱情痢法,我是刑警寧澤,帶...
    沈念sama閱讀 36,303評論 5 350
  • 正文 年R本政府宣布杜顺,位于F島的核電站财搁,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏躬络。R本人自食惡果不足惜尖奔,卻給世界環(huán)境...
    茶點故事閱讀 41,979評論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望穷当。 院中可真熱鬧提茁,春花似錦、人聲如沸馁菜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,470評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽火邓。三九已至丹弱,卻和暖如春德撬,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背躲胳。 一陣腳步聲響...
    開封第一講書人閱讀 33,571評論 1 272
  • 我被黑心中介騙來泰國打工蜓洪, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人坯苹。 一個月前我還...
    沈念sama閱讀 49,041評論 3 377
  • 正文 我出身青樓隆檀,卻偏偏與公主長得像,于是被迫代替她去往敵國和親粹湃。 傳聞我的和親對象是個殘疾皇子恐仑,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,630評論 2 359

推薦閱讀更多精彩內(nèi)容

  • 都說人生如戲場,一個人都兼具數(shù)個角色为鳄。我們每天疲于奔波裳仆,游走滄浪之水,清兮濯兮孤钦,只有自己知道歧斟。 既然都是演員,角色...
    遠(yuǎn)山歸舟閱讀 791評論 7 27
  • 軟件工程流程以及工具整理 產(chǎn)品設(shè)計 文檔管理 禪道 設(shè)計評審 禪道 開發(fā)設(shè)計 設(shè)計文檔 禪道 設(shè)計評審 軟件開發(fā) ...
    zy17閱讀 584評論 0 1
  • 今天值班偏形,忽然想到家里洗衣液告急静袖,于是到單位門口的小超市去買。 小超市里人不多俊扭,我先挑了一包洗衣液队橙,覺得比較重,順...
    冬之雯語閱讀 419評論 5 10