數(shù)據(jù)結(jié)構(gòu)(六)二分搜索樹(Binary Search Tree)(下)

數(shù)據(jù)結(jié)構(gòu)(一)數(shù)組實(shí)現(xiàn)一個(gè)簡單的ArrayList
數(shù)據(jù)結(jié)構(gòu)(二)鏈表實(shí)現(xiàn)LinkedList
數(shù)據(jù)結(jié)構(gòu)(三)用兩種方式簡單實(shí)現(xiàn)棧
數(shù)據(jù)結(jié)構(gòu)(四)棧和隊(duì)列的簡單應(yīng)用
數(shù)據(jù)結(jié)構(gòu)(五)用兩種方式簡單實(shí)現(xiàn)隊(duì)列
數(shù)據(jù)結(jié)構(gòu)(六)二分搜索樹(Binary Search Tree)(上)
數(shù)據(jù)結(jié)構(gòu)(六)二分搜索樹(Binary Search Tree)(下)
數(shù)據(jù)結(jié)構(gòu)(七)兩種方式實(shí)現(xiàn)set
數(shù)據(jù)結(jié)構(gòu)(八)兩種方式實(shí)現(xiàn)map
數(shù)據(jù)結(jié)構(gòu)(九)set解決LeetCode349號(hào)問題

今天這篇文章是接上次的文章茵休,二分搜索樹還有幾個(gè)方法沒有分析完薪棒。簡單回顧一下,昨天我們分析了添加操作榕莺,是否包含操作赃阀,最小值澎媒,最大值镇眷,以及刪除最大值最小值操作鼓鲁。今天我們分析一下刪除操作,以及他的幾個(gè)遍歷方法:前序遍歷唠雕,中序遍歷以及后續(xù)遍歷扣蜻。

  • preOrder
// 二分搜索樹的前序遍歷
    public void preOrder(){
        preOrder(root);
    }

    // 前序遍歷以node為根的二分搜索樹, 遞歸算法
    private void preOrder(Node node){
        if(node == null)
            return;
        System.out.println(node.e);
        preOrder(node.left);
        preOrder(node.right);
    }

這里我們同樣用遞歸實(shí)現(xiàn)前序遍歷。先找到結(jié)束的條件就是當(dāng)前節(jié)點(diǎn)為空就結(jié)束了及塘。前序遍歷就是先打印當(dāng)前節(jié)點(diǎn)莽使,然后再打印左子樹然后是右子樹。這樣前序遍歷就完成笙僚。


前序遍歷順序

大家可以看一下上邊這個(gè)圖芳肌。這里就是前序遍歷的順序圖。下邊這個(gè)圖是她的打印結(jié)果肋层。


preoderPrint
  • inOrder 好了看完了前序遍歷我們來看一下中序遍歷其實(shí)和前序遍歷一樣
   // 二分搜索樹的中序遍歷
    public void inOrder(){
        inOrder(root);
    }

    // 中序遍歷以node為根的二分搜索樹, 遞歸算法
    private void inOrder(Node node){

        if(node == null)
            return;

        inOrder(node.left);
        System.out.println(node.e);
        inOrder(node.right);
    }

這里唯一一點(diǎn)不同的是 先打印左子樹亿笤,然后是根節(jié)點(diǎn),然后是右子樹栋猖。下邊是她的打印結(jié)果净薛。


InorderPrint

大家有沒有發(fā)現(xiàn)一個(gè)好玩的地方,對沒錯(cuò)他是按從小到大的順序排序好的蒲拉。所以二分搜索樹的一個(gè)特性就是中序遍歷是從小到大的排序好的肃拜。

  • postOrder
    后續(xù)遍歷跟之前的前序痴腌、中序遍歷一樣我想大家都可以自己寫出代碼,這里我們就不過多的解釋。
         postOrder(node.left);
         postOrder(node.right);
         System.out.println(node.e);
  • remove
//刪除以node為根的二分搜索樹中元素為e的節(jié)點(diǎn)燃领,遞歸算法
    //返回刪除節(jié)點(diǎn)后二分搜索樹的根
    private Node remove(Node node, E e) {
        if (node == null)
            return null;
        if (e.compareTo(node.e) < 0) {
            node.left = remove(node.left, e);
            return node;
        } else if (e.compareTo(node.e) > 0) {
            node.right = remove(node.right, e);
            return node;
        } else {// e == node.e
            if (node.left == null) {
                Node right = node.right;
                node.right = null;
                size--;
                return right;
            }

            if (node.right == null) {
                Node left = node.left;
                node.left = null;
                size--;
                return left;
            }

            Node successor = mininum(node.right);
            successor.right = removeMin(node.right);
            successor.left = node.left;
            node.left = node.right = null;
            return successor;

        }
    }

刪除方法這個(gè)比較復(fù)雜了士聪,這里也是遞歸的方式實(shí)現(xiàn)。寫一個(gè)以node為根的節(jié)點(diǎn)的方法猛蔽。如果這個(gè)節(jié)點(diǎn)為空就返回空剥悟,如果傳入的元素比當(dāng)前節(jié)點(diǎn)的的元素小,那么就去他的左子樹去找曼库;如果傳入的元素比當(dāng)前節(jié)點(diǎn)的元素大那么就去他的右子樹去找区岗。如果傳入的元素等于當(dāng)前節(jié)點(diǎn)那么又有三種情況:如果左子樹是空的,那么直接刪除這個(gè)節(jié)點(diǎn)毁枯,然后把他的右子樹返回就可以了躏尉;如果這個(gè)節(jié)點(diǎn)的右子樹為空那么就刪除這個(gè)節(jié)點(diǎn),然后把它的左子樹返回就可以了后众;如果刪除的這個(gè)節(jié)點(diǎn)左右子樹都不為空,那么就吧右子樹的最小值放到這個(gè)節(jié)點(diǎn)上就可以了颅拦,當(dāng)然也可以把左子樹的最大值放到這個(gè)節(jié)點(diǎn)上蒂誉,這樣還滿足這是一棵二分搜索樹。具體的替換綠色的小球表示要替換旁邊紅色的小球距帅,紅色小球是要被替換的小球右锨。


刪除

到這里二分搜索書的基本方法都介紹完了。希望大家可以明白碌秸,有什么不明白的可以評論里說绍移。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市讥电,隨后出現(xiàn)的幾起案子蹂窖,更是在濱河造成了極大的恐慌,老刑警劉巖恩敌,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件瞬测,死亡現(xiàn)場離奇詭異,居然都是意外死亡纠炮,警方通過查閱死者的電腦和手機(jī)月趟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來恢口,“玉大人孝宗,你說我怎么就攤上這事「纾” “怎么了因妇?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵问潭,是天一觀的道長。 經(jīng)常有香客問我沙峻,道長睦授,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任摔寨,我火速辦了婚禮去枷,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘是复。我一直安慰自己删顶,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布淑廊。 她就那樣靜靜地躺著逗余,像睡著了一般。 火紅的嫁衣襯著肌膚如雪季惩。 梳的紋絲不亂的頭發(fā)上录粱,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天,我揣著相機(jī)與錄音画拾,去河邊找鬼啥繁。 笑死,一個(gè)胖子當(dāng)著我的面吹牛青抛,可吹牛的內(nèi)容都是我干的旗闽。 我是一名探鬼主播,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼蜜另,長吁一口氣:“原來是場噩夢啊……” “哼适室!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起举瑰,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤捣辆,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后此迅,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體罪帖,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年邮屁,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了整袁。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,696評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡佑吝,死狀恐怖坐昙,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情芋忿,我是刑警寧澤炸客,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布疾棵,位于F島的核電站,受9級特大地震影響痹仙,放射性物質(zhì)發(fā)生泄漏是尔。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一开仰、第九天 我趴在偏房一處隱蔽的房頂上張望拟枚。 院中可真熱鬧,春花似錦众弓、人聲如沸恩溅。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽脚乡。三九已至,卻和暖如春滨达,著一層夾襖步出監(jiān)牢的瞬間奶稠,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工捡遍, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留锌订,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓稽莉,卻偏偏與公主長得像,于是被迫代替她去往敵國和親涩搓。 傳聞我的和親對象是個(gè)殘疾皇子污秆,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評論 2 353

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