669 修剪二叉搜尋樹

2021-10-24 23:59:24 字數 2156 閱讀 3513

一道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...