一道easy題目,但是直接上手有點難度,麻煩的地方在於會改變二叉樹的結構
注意這是一顆二叉搜尋樹,應該能利用到二叉搜尋樹的性質來遍歷
然後給定區間是[lo
w,hi
gh][low,high]
[low,h
igh]
一顆二叉搜尋樹的定義是左小右大的,那麼一共還是三種情況,設根節點的值是val
則low<=val<=high
無事發生,但是要繼續判斷左右子樹,刪除掉值域外的結點
valval>high
根節點的值大於high,是val
根據上述三種情況,我們假設trimbst能夠根據low和high的範圍來修建乙個二叉搜尋樹,並且返回修剪後的結點
然後依次設計trimbst裡面的三個操作
邊界情況
root為空的時候我們直接返回root就行
還有乙個特殊情況,就是這個根節點無左右孩子,但是它當前的值不屬於[lo
w,hi
gh][low,high]
[low,h
igh]
這個區間,那麼我們也是直接返回none,表示刪除了這個節點
一般情況(當前層次需要執行的操作)
其實就是我們上面分析的三種情況,唯一麻煩的地方,就是我們要更新根節點,但是更新根節點的情況只會在2、3這兩種情況下發生,發生的時候必有一顆子樹被捨棄,我們直接將另乙個孩子結點作為新的根節點返回即可
返回依然是根據三種情況來返回
1 返回root,其左右子樹更新為trimbst(root.left,…),trimbst(root.right,…)
2 返回trimbst(root.right,…)
3 返回trimbst(root.left,…)
寫出偽**
def
trimbst
(root,low,high)
:if 根節點為空:
return
none
if 根節點左右子樹為空,並且根節點的值不屬於[low,high]
return
none
if low<=root.val<=high:
root.left = trimbst(root.left,low,high)
root.right = trimbst(root.right,low,high)
return root
elif root.val
return trimbst(root.right,low,high)
elif root.val>high:
return trimbst(root.left,low,high)
通過了 遞迴就是這麼神奇,只需要考慮
1 邊界條件——特殊情況
2 當前操作——一般情況
3 返回值
這三個情況,題目迎刃而解
上述**的if邏輯有些混亂,更改後更加簡潔,無左右孩子子樹的情況不需要額外放出來
class
solution
:def
trimbst
(self, root: treenode, low:
int, high:
int)
-> treenode:
# 邊界情況
669 修剪二叉搜尋樹
一開始的思路是憑藉乙個pre指標,pre指標指向當前遍歷節點的父節點,然後當發現該節點不符合要求時,利用二叉搜尋樹的性質,若該節點是小於左邊界的,則它的左子樹也勢必不符合要求,此時將該節點的父節點指向該節點的右子樹。當該節點的值大於r時同理。但是沒成功,自己沒想到這種方法的解決辦法,感覺乙個原因是因...
669 修剪二叉搜尋樹
root為空直接返回null root不為空 要麼左邊出界 root val很小,則root的左子樹值更小就不用看了,但root的右子樹中仍可能找到符合要求的結點,因此將root right看作新的根節點繼續去找,並返回給上一層連線 要麼右邊出界 同理,將root left看作新的根節點繼續去找,並...
LeetCode 669 修剪二叉搜尋樹
給定乙個二叉搜尋樹,同時給定最小邊界l 和最大邊界 r。通過修剪二叉搜尋樹,使得所有節點的值在 l,r 中 r l 你可能需要改變樹的根節點,所以結果應當返回修剪好的二叉搜尋樹的新的根節點。如果當前節點值大於r,則說明該節點的右子樹都大於r 所以可直接捨棄該節點的右子樹,然後再繼續往左子樹 找打 r...