前往
大廳
主題

LeetCode - 669. Trim a Binary Search Tree 解題心得

Not In My Back Yard | 2020-12-16 00:00:06 | 巴幣 0 | 人氣 212

題目連結:


題目意譯:
給定一棵二元搜尋樹(Binary Search Tree,BST)的根節點 root 以及下界值 low 和上界值 high,修剪這棵樹使得所有元素值位於 [low, high] 範圍之中。修剪的過程不應該改變樹裡剩下的元素間之相對結構(即任何節點的子節點應維持是子節點(如果修剪後還在的話))。可以證明此過程只會得到唯一解。

回傳修剪後的 BST 之根節點。注意根據給定的上下界,root 可能會改變。

限制:
樹的節點數在 [1, 10 ^ 4] 範圍中。
0 ≦ Node.val ≦ 10 ^ 4
樹中的所有節點值皆相異。
root 保證指向一棵合法的 BST。
0 ≦ low ≦ high ≦ 10 ^ 4



範例測資:
範例 1:
輸入: root = [1,0,2], low = 1, high = 2
輸出: [1,null,2]

範例 2:
輸入: root = [3,0,4,null,2,null,null,1], low = 1, high = 3
輸出: [3,2,null,1]

範例 3:
輸入: root = [1], low = 1, high = 2
輸出: [1]

範例 4:
輸入: root = [1,null,2], low = 1, high = 3
輸出: [1,null,2]

範例 5:
輸入: root = [1,null,2], low = 2, high = 4
輸出: [2]


解題思維:
我們先來看看為什麼解會是唯一的:
考慮某一個節點,該節點可能會被移除也有可能不會。當不會被移除時,那麼就是看它的左子樹、右子樹各自有沒有要刪除的節點(即遞迴);

如果這個節點會被移掉的話,代表它超過了上界(或是下界)。當它是超過上界時,因為二元搜尋樹的定義——右子樹的所有節點值都大於等於它的值,所以右子樹肯定會跟著被移除,因此就是剩下左子樹的部分(遞迴);而超過下界與超出上界同理,只是換成左子樹會被移除。

因為對於每個節點只有唯一一條選擇的路可以走,因此解是必定唯一的。



而從上面可以看到本題的遞迴解法,定義 Trim(root, low, high):
當 root 指向空節點(NULL)時,代表整棵為空,所以直接回傳空節點即可;
當 root 之值超出上界時,右子樹會被跟著一起移除,因此遞迴搜尋左子樹 Trim(root->left, low, high) 並將其回傳值(一個指標)當作回傳值;
當 root 之值超出下界時,左子樹會被跟著一起移除,因此遞迴搜尋右子樹 Trim(root->right, low, high) 並將其回傳值當作回傳值;
如果 root 之值既沒超過上界也沒超過下界,則遞迴搜尋其左子樹 Trim(root->left, low, high) 以及右子樹 Trim(root->right, low, high) 並將回傳結果作為它的新左子樹以及右子樹。




此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。

創作回應

更多創作