二分搜索樹 10 刪除最大 & 最小元素

尋找二分搜索樹的最小元素

  • 二分搜索樹的最小元素一定在最左路的盡頭,整個最左路其實就是一個鏈表胚膊,問題其實就是:取到最左路鏈表的最后一個元素故俐;
  • 將問題轉(zhuǎn)化為一個遞歸問題:尋找以 node 為頭節(jié)點的最左路鏈表的最后一個元素;
  • 規(guī)模更小的同一個問題是:尋找以 node.left 為頭節(jié)點的最左路鏈表的最后一個元素(將整條鏈表看成由 nodenode.left 組成)紊婉;
  • 不能再縮小的基本問題是:node.left == null药版;
// 尋找二分搜索樹的最小元素
public E minimum(){
    if(size == 0)
        throw new IllegalArgumentException("BST is empty");

    Node minNode = minimum(root);
    return minNode.e;
}

// 返回以node為根的二分搜索樹的最小值所在的節(jié)點
private Node minimum(Node node){
    if(node.left == null)
        return node;

    return minimum(node.left);
}

刪除 BST 中的最小元素

  • 將問題轉(zhuǎn)換為一個遞歸的問題:刪除以 node 為根的 BST 的最小元素,并返回新 BST 的根喻犁;
  • 規(guī)模更小的同一個問題是:刪除以 node.left 為根的 BST 的最小元素槽片,并返回新 BST 的根;
  • 不能再縮小的基本問題是:node.left == null肢础;
    • 此時 node 就為該 BST 的最小元素还栓,該被刪掉;
    • 取出 node.right 并返回传轰;
    • 斷開 node 和右孩子的關(guān)系剩盒,即 node.right == null
    • 減少整個 BST 的節(jié)點個數(shù)慨蛙,即 size --辽聊;
// 從二分搜索樹中刪除最小值所在節(jié)點, 返回最小值
public E removeMin(){
    E ret = minimum();
    root = removeMin(root);
    return ret;
}

// 刪除掉以node為根的二分搜索樹中的最小節(jié)點
// 返回刪除節(jié)點后新的二分搜索樹的根
private Node removeMin(Node node){

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

    node.left = removeMin(node.left);
    return node;
}

測試代碼

public class Main {

    public static void main(String[] args) {
        BST<Integer> bst = new BST<>();

        Random random = new Random();
        int n = 1000;

        // test removeMin
        for(int i = 0 ; i < n ; i ++)
            bst.add(random.nextInt(10000));

        ArrayList<Integer> nums = new ArrayList<>();
        while(!bst.isEmpty())
            nums.add(bst.removeMin());

        System.out.println(nums);
        for(int i = 1 ; i < nums.size() ; i ++)
            if(nums.get(i - 1) > nums.get(i))
                throw new IllegalArgumentException("Error!");
        System.out.println("removeMin test completed.");
    }

}
輸出

[1, 19, 20, 35, 36, 38, 48, 66, 71, 84, 87, 92, 98, 114, 124, 128, 132, 134, 143, 145, 156, 170, 177, 186, 204, 205, 207, 209, 222, 224, 231, 237, 238, 247, 250, 258, 266, 278, 290, 291, 308, 316, 321, 328, 331, 363, 371, 380, 383, 390, 426, 467, 473, 483, 486, 495, 500, 502, 510, 518, 522, 534, 548, 555, 558, 581, 588, 592, 602, 639, 652, 656, 660, 662, 667, 694, 724, 730, 735, 741, 754, 778, 798, 809, 815, 817, 819, 824, 840, 866, 878, 885, 886, 900, 901, 902, 916, 918, 924, 935, 941, 945, 954, 962, 964, 989, 999, 1001, 1009, 1012, 1027, 1029, 1033, 1039, 1054, 1059, 1070, 1075, 1082, 1087, 1093, 1104, 1139, 1141, 1155, 1168, 1180, 1181, 1188, 1213, 1223, 1225, 1227, 1233, 1240, 1248, 1272, 1289, 1314, 1326, 1332, 1334, 1349, 1382, 1386, 1387, 1388, 1405, 1416, 1418, 1420, 1434, 1435, 1441, 1446, 1447, 1471, 1499, 1506, 1524, 1525, 1527, 1543, 1549, 1570, 1578, 1582, 1587, 1603, 1608, 1638, 1643, 1652, 1665, 1678, 1691, 1707, 1713, 1725, 1775, 1793, 1814, 1834, 1839, 1901, 1912, 1926, 1934, 1956, 1964, 1981, 1990, 1992, 1996, 2011, 2012, 2018, 2033, 2035, 2042, 2048, 2067, 2101, 2117, 2122, 2130, 2136, 2142, 2150, 2151, 2153, 2164, 2165, 2195, 2199, 2202, 2204, 2228, 2244, 2245, 2258, 2260, 2267, 2280, 2288, 2298, 2324, 2351, 2363, 2368, 2374, 2380, 2396, 2403, 2414, 2431, 2439, 2446, 2459, 2470, 2485, 2511, 2535, 2551, 2619, 2630, 2647, 2663, 2674, 2702, 2706, 2720, 2728, 2740, 2741, 2760, 2805, 2814, 2815, 2819, 2832, 2844, 2847, 2865, 2874, 2887, 2905, 2915, 2933, 2939, 2942, 2944, 2951, 2961, 2962, 2963, 2979, 2980, 2993, 3006, 3036, 3053, 3058, 3067, 3077, 3096, 3128, 3150, 3161, 3172, 3174, 3175, 3185, 3186, 3187, 3248, 3265, 3278, 3296, 3301, 3306, 3311, 3315, 3321, 3326, 3342, 3349, 3361, 3365, 3369, 3383, 3401, 3413, 3423, 3424, 3426, 3429, 3450, 3466, 3501, 3512, 3514, 3548, 3554, 3564, 3582, 3583, 3584, 3585, 3588, 3605, 3607, 3635, 3639, 3664, 3666, 3674, 3685, 3686, 3688, 3702, 3709, 3718, 3727, 3740, 3749, 3755, 3759, 3774, 3781, 3784, 3795, 3800, 3805, 3809, 3819, 3829, 3857, 3865, 3886, 3903, 3957, 3964, 3977, 3995, 3999, 4010, 4022, 4064, 4069, 4075, 4083, 4093, 4098, 4112, 4117, 4138, 4160, 4163, 4165, 4166, 4171, 4172, 4192, 4196, 4212, 4225, 4238, 4242, 4244, 4275, 4324, 4326, 4334, 4343, 4369, 4381, 4389, 4398, 4404, 4409, 4424, 4427, 4457, 4473, 4483, 4498, 4514, 4542, 4543, 4579, 4589, 4607, 4631, 4645, 4672, 4675, 4680, 4688, 4710, 4717, 4719, 4721, 4733, 4748, 4750, 4758, 4766, 4779, 4788, 4790, 4800, 4801, 4816, 4845, 4858, 4876, 4881, 4895, 4898, 4903, 4905, 4908, 4910, 4913, 4922, 4947, 4949, 4955, 4973, 4983, 5000, 5009, 5016, 5023, 5025, 5030, 5044, 5048, 5049, 5057, 5073, 5078, 5079, 5080, 5084, 5093, 5102, 5142, 5149, 5154, 5158, 5173, 5187, 5194, 5198, 5205, 5206, 5214, 5243, 5258, 5259, 5270, 5274, 5342, 5351, 5353, 5354, 5361, 5366, 5373, 5378, 5388, 5404, 5417, 5439, 5441, 5455, 5458, 5466, 5485, 5492, 5517, 5520, 5524, 5537, 5543, 5550, 5557, 5560, 5568, 5579, 5580, 5585, 5591, 5600, 5601, 5613, 5614, 5626, 5640, 5651, 5652, 5657, 5664, 5694, 5704, 5712, 5718, 5719, 5744, 5748, 5769, 5780, 5784, 5785, 5796, 5799, 5806, 5811, 5814, 5824, 5864, 5871, 5885, 5900, 5910, 5945, 5957, 5985, 6008, 6009, 6012, 6014, 6017, 6039, 6061, 6067, 6095, 6109, 6140, 6150, 6158, 6160, 6165, 6168, 6175, 6196, 6211, 6240, 6243, 6249, 6257, 6259, 6283, 6288, 6292, 6312, 6354, 6357, 6366, 6373, 6382, 6391, 6399, 6408, 6414, 6416, 6417, 6426, 6428, 6432, 6436, 6438, 6439, 6497, 6505, 6509, 6528, 6547, 6549, 6551, 6563, 6593, 6596, 6597, 6599, 6610, 6613, 6620, 6627, 6629, 6657, 6668, 6687, 6691, 6702, 6707, 6727, 6742, 6747, 6754, 6768, 6784, 6787, 6791, 6793, 6796, 6798, 6803, 6822, 6833, 6835, 6837, 6852, 6861, 6884, 6910, 6924, 6925, 6926, 6941, 6970, 6983, 7002, 7003, 7012, 7014, 7026, 7035, 7043, 7058, 7074, 7076, 7078, 7090, 7106, 7109, 7116, 7117, 7126, 7128, 7145, 7151, 7157, 7159, 7164, 7167, 7171, 7185, 7200, 7208, 7245, 7253, 7255, 7258, 7259, 7265, 7279, 7282, 7286, 7297, 7302, 7308, 7312, 7315, 7323, 7324, 7328, 7338, 7342, 7345, 7350, 7356, 7371, 7382, 7383, 7391, 7426, 7433, 7452, 7454, 7467, 7469, 7474, 7529, 7531, 7560, 7563, 7570, 7576, 7581, 7589, 7596, 7601, 7629, 7638, 7639, 7651, 7654, 7657, 7658, 7659, 7660, 7669, 7735, 7758, 7759, 7766, 7778, 7780, 7782, 7792, 7794, 7802, 7811, 7835, 7862, 7864, 7871, 7874, 7883, 7886, 7889, 7903, 7906, 7907, 7918, 7933, 7939, 7956, 7959, 7971, 7977, 7979, 8000, 8002, 8014, 8020, 8022, 8028, 8029, 8032, 8034, 8038, 8053, 8066, 8082, 8085, 8086, 8093, 8094, 8117, 8122, 8126, 8127, 8137, 8152, 8172, 8179, 8218, 8219, 8223, 8238, 8241, 8242, 8251, 8257, 8271, 8272, 8293, 8297, 8319, 8325, 8328, 8357, 8385, 8395, 8428, 8431, 8465, 8483, 8491, 8503, 8505, 8507, 8513, 8516, 8521, 8527, 8532, 8534, 8559, 8572, 8592, 8603, 8627, 8632, 8633, 8644, 8650, 8668, 8672, 8684, 8712, 8716, 8725, 8740, 8755, 8771, 8773, 8792, 8802, 8803, 8810, 8816, 8818, 8823, 8831, 8851, 8863, 8871, 8885, 8917, 8919, 8930, 8934, 8935, 8940, 8947, 8956, 8958, 8972, 8974, 8979, 8987, 8991, 8994, 8995, 8998, 9006, 9009, 9033, 9037, 9062, 9064, 9067, 9095, 9097, 9102, 9127, 9128, 9140, 9153, 9189, 9193, 9206, 9230, 9235, 9236, 9239, 9241, 9244, 9262, 9273, 9305, 9316, 9330, 9354, 9362, 9368, 9386, 9388, 9393, 9396, 9397, 9417, 9422, 9438, 9440, 9444, 9445, 9455, 9456, 9465, 9485, 9512, 9522, 9523, 9542, 9548, 9562, 9564, 9591, 9594, 9617, 9623, 9634, 9644, 9650, 9651, 9653, 9655, 9701, 9705, 9706, 9710, 9715, 9723, 9727, 9732, 9733, 9734, 9742, 9745, 9758, 9776, 9788, 9801, 9812, 9817, 9836, 9838, 9841, 9851, 9869, 9870, 9873, 9882, 9951, 9955, 9960, 9964]
removeMin test completed.

刪除BST中的最大元素

// 尋找二分搜索樹的最大元素
public E maximum(){
    if(size == 0)
        throw new IllegalArgumentException("BST is empty");

    return maximum(root).e;
}

// 返回以node為根的二分搜索樹的最大值所在的節(jié)點
private Node maximum(Node node){
    if( node.right == null )
        return node;

    return maximum(node.right);
}

// 從二分搜索樹中刪除最大值所在節(jié)點
public E removeMax(){
    E ret = maximum();
    root = removeMax(root);
    return ret;
}

// 刪除掉以node為根的二分搜索樹中的最大節(jié)點
// 返回刪除節(jié)點后新的二分搜索樹的根
private Node removeMax(Node node){
    if(node.right == null){
        Node leftNode = node.left;
        node.left = null;
        size --;
        return leftNode;
    }

    node.right = removeMax(node.right);
    return node;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末纪挎,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子跟匆,更是在濱河造成了極大的恐慌异袄,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,427評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件玛臂,死亡現(xiàn)場離奇詭異烤蜕,居然都是意外死亡,警方通過查閱死者的電腦和手機迹冤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評論 3 395
  • 文/潘曉璐 我一進店門讽营,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人叁巨,你說我怎么就攤上這事斑匪。” “怎么了锋勺?”我有些...
    開封第一講書人閱讀 165,747評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長狡蝶。 經(jīng)常有香客問我庶橱,道長,這世上最難降的妖魔是什么贪惹? 我笑而不...
    開封第一講書人閱讀 58,939評論 1 295
  • 正文 為了忘掉前任苏章,我火速辦了婚禮,結(jié)果婚禮上奏瞬,老公的妹妹穿的比我還像新娘枫绅。我一直安慰自己,他們只是感情好硼端,可當(dāng)我...
    茶點故事閱讀 67,955評論 6 392
  • 文/花漫 我一把揭開白布并淋。 她就那樣靜靜地躺著,像睡著了一般珍昨。 火紅的嫁衣襯著肌膚如雪县耽。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,737評論 1 305
  • 那天镣典,我揣著相機與錄音兔毙,去河邊找鬼。 笑死兄春,一個胖子當(dāng)著我的面吹牛澎剥,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播赶舆,決...
    沈念sama閱讀 40,448評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼哑姚,長吁一口氣:“原來是場噩夢啊……” “哼趾唱!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起蜻懦,我...
    開封第一講書人閱讀 39,352評論 0 276
  • 序言:老撾萬榮一對情侶失蹤甜癞,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后宛乃,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體悠咱,經(jīng)...
    沈念sama閱讀 45,834評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,992評論 3 338
  • 正文 我和宋清朗相戀三年征炼,在試婚紗的時候發(fā)現(xiàn)自己被綠了析既。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,133評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡谆奥,死狀恐怖眼坏,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情酸些,我是刑警寧澤宰译,帶...
    沈念sama閱讀 35,815評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站魄懂,受9級特大地震影響沿侈,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜市栗,卻給世界環(huán)境...
    茶點故事閱讀 41,477評論 3 331
  • 文/蒙蒙 一缀拭、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸嗡善。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至哀蘑,卻和暖如春诚卸,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背绘迁。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評論 1 272
  • 我被黑心中介騙來泰國打工合溺, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人缀台。 一個月前我還...
    沈念sama閱讀 48,398評論 3 373
  • 正文 我出身青樓棠赛,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子睛约,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,077評論 2 355

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