今天分享的題目來源于 LeetCode 第 450 號問題:刪除二叉搜索樹中的節(jié)點(diǎn)。雖然它的難度是中等,但實(shí)際上很好理解,請往下看!
題目描述
給定一個二叉搜索樹的根節(jié)點(diǎn)root和一個值key,刪除二叉搜索樹中的key對應(yīng)的節(jié)點(diǎn),并保證二叉搜索樹的性質(zhì)不變。返回二叉搜索樹(有可能被更新)的根節(jié)點(diǎn)的引用。
一般來說,刪除節(jié)點(diǎn)可分為兩個步驟:
首先找到需要刪除的節(jié)點(diǎn);
如果找到了,刪除它。
說明:要求算法時間復(fù)雜度為 O(h),h 為樹的高度。
示例:
root=[5,3,6,2,4,null,7] key=3 5 / 36 / 247 給定需要刪除的節(jié)點(diǎn)值是3,所以我們首先找到3這個節(jié)點(diǎn),然后刪除它。 一個正確的答案是[5,4,6,2,null,null,7], 如下圖所示。 5 / 46 / 27 另一個正確答案是[5,2,6,null,4,null,7]。 5 / 26 47
題目解析
在二叉搜索樹上刪除一個節(jié)點(diǎn),這道題目有一個隱含的條件,就是樹上節(jié)點(diǎn)的值不重復(fù)。
另外題目還要求時間復(fù)雜度需要保證 O(h) 這里的 h 表示的是二叉樹的高度。
其實(shí)這個題目是分成兩個步驟的,第一個是找到對應(yīng)的節(jié)點(diǎn),第二個是刪除節(jié)點(diǎn)。
因?yàn)槭嵌嫠阉鳂?,對于樹上每個節(jié)點(diǎn)來說,其右子樹的節(jié)點(diǎn)都要大于其左子樹的節(jié)點(diǎn),那么要找對應(yīng)節(jié)點(diǎn),我們可以從根節(jié)點(diǎn)開始,一路比較,大的話就去右邊找,小的話就去左邊找,這樣每次我們都往下,可以保證時間復(fù)雜度是 O(h)。
當(dāng)我們找到了要刪除的節(jié)點(diǎn),在刪除這一步就會有很多的細(xì)節(jié),主要是因?yàn)槲覀冃枰{(diào)整余下的結(jié)構(gòu),以維持二叉搜索樹的性質(zhì)。
針對這個問題,我們可以分情況討論:
5 / 36 / 247 / 18
情況 1:當(dāng)刪除的節(jié)點(diǎn)沒有左右子樹,比如上圖的 4、8、1
這時直接刪除即可,樹依舊可以保持二叉搜索樹的性質(zhì)
情況 2:當(dāng)刪除的節(jié)點(diǎn)有左子樹沒有右子樹,比如上圖的 2
這時我們只需要將整個左子樹移到當(dāng)前位置即可
也就是將左子樹的根節(jié)點(diǎn)放到刪除節(jié)點(diǎn)的位置,其余不變
情況 3:當(dāng)刪除的節(jié)點(diǎn)沒有左子樹有右子樹,比如上圖的 6、7
這時我們只需要將整個右子樹移到當(dāng)前位置即可
也就是將右子樹的根節(jié)點(diǎn)放到刪除節(jié)點(diǎn)的位置,其余不變
情況 4:當(dāng)刪除的節(jié)點(diǎn)既有左子樹又有右子樹,比如上圖的 5、3
這時就有兩種方法供選擇:
去到左子樹中,找到值最大節(jié)點(diǎn),將右子樹全部移到這個節(jié)點(diǎn)下
去到右子樹中,找到值最小節(jié)點(diǎn),將左子樹全部移到這個節(jié)點(diǎn)下
通過上面的討論分析,我們有了大致的思路。在實(shí)現(xiàn)方面,我們可以借助遞歸來巧妙地達(dá)到刪除對應(yīng)節(jié)點(diǎn)的目的。
圖片描述










參考代碼
//五分鐘學(xué)算法 publicTreeNodedeleteNode(TreeNoderoot,intkey){ if(root==null){ returnnull; } //當(dāng)前遍歷到的節(jié)點(diǎn)大于要找的節(jié)點(diǎn),去左邊繼續(xù)找 if(root.val>key){ root.left=deleteNode(root.left,key); } //當(dāng)前遍歷到的節(jié)點(diǎn)小于要找的節(jié)點(diǎn),去右邊繼續(xù)找 elseif(root.val
-
算法
+關(guān)注
關(guān)注
23文章
4784瀏覽量
98073 -
二叉樹
+關(guān)注
關(guān)注
0文章
74瀏覽量
12935
原文標(biāo)題:五分鐘看懂一道中等難度的算法題
文章出處:【微信號:TheAlgorithm,微信公眾號:算法與數(shù)據(jù)結(jié)構(gòu)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
深入理解設(shè)備樹chosen節(jié)點(diǎn):固件與內(nèi)核的“配置橋梁”
無線傾角傳感器在古樹監(jiān)測中的應(yīng)用:以科技守護(hù)活文物的結(jié)構(gòu)安全
億緯鋰能與杭叉集團(tuán)達(dá)成戰(zhàn)略合作
EtherCAT總線節(jié)點(diǎn)順序錯誤問題詳解
淘寶圖片搜索商品API指南
線性搜索與二分搜索介紹
`lv_obj_tree.h` 在 **LVGL v9** 中的位置和作用
通過優(yōu)化代碼來提高M(jìn)CU運(yùn)行效率
按圖搜索1688商品的API接口
產(chǎn)品搜索與過濾API接口
刪除二叉搜索樹中的節(jié)點(diǎn)
評論