669 修剪二叉搜尋樹(遞迴建立刪除節點後的子樹)

2021-10-10 04:41:35 字數 1816 閱讀 4339

1. 問題描述:

給你二叉搜尋樹的根節點 root ,同時給定最小邊界low 和最大邊界 high。通過修剪二叉搜尋樹,使得所有節點的值在[low, high]中。修剪樹不應該改變保留在樹中的元素的相對結構(即,如果沒有被移除,原有的父代子代關係都應當保留)。 可以證明,存在唯一的答案。

所以結果應當返回修剪好的二叉搜尋樹的新的根節點。注意,根節點可能會根據給定的邊界發生改變。

示例 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 = 2, high = 4

輸出:[2]

樹中節點數在範圍 [1, 104] 內

0 <= node.val <= 104

樹中每個節點的值都是唯一的

題目資料保證輸入是一棵有效的二叉搜尋樹

0 <= low <= high <= 104

2. 思路分析:

一開始的時候感覺這道題目挺複雜的,因為可能需要刪除很多個節點,之前力扣中也有一道類似的題目,那道題目是指定刪除乙個節點,在看了官方的題解之後,發現思路真的是妙呀,自己之前居然沒有往二叉搜尋樹的特點上去思考,當我們在遞迴遍歷節點的時候發現當前的根節點的值大於了r,說明滿足[l,r]範圍的節點只可能在根節點的左子樹的,因為根節點右子樹的值肯定都比r要大的,當發現當前根節點的值小於了l說明我們需要往根節點的右子樹中找,這樣才能夠保證節點的值有可能在l之後的範圍的,所以我們可以使用遞迴來建立刪除節點之後的二叉搜尋樹,在遞迴的時候利用層層返回特點並且使用指標來連線節點之間的關係:當前節點的左右指標連線往下遞迴返回的結果

3. **如下:

官方的**:

class solution(object):

def trimbst(self, root, l, r):

def trim(node):

if not node:

return none

elif node.val > r:

return trim(node.left)

elif node.val < l:

return trim(node.right)

else:

node.left = trim(node.left)

node.right = trim(node.right)

return node

return trim(root)

669 修剪二叉搜尋樹

一開始的思路是憑藉乙個pre指標,pre指標指向當前遍歷節點的父節點,然後當發現該節點不符合要求時,利用二叉搜尋樹的性質,若該節點是小於左邊界的,則它的左子樹也勢必不符合要求,此時將該節點的父節點指向該節點的右子樹。當該節點的值大於r時同理。但是沒成功,自己沒想到這種方法的解決辦法,感覺乙個原因是因...

669 修剪二叉搜尋樹

root為空直接返回null root不為空 要麼左邊出界 root val很小,則root的左子樹值更小就不用看了,但root的右子樹中仍可能找到符合要求的結點,因此將root right看作新的根節點繼續去找,並返回給上一層連線 要麼右邊出界 同理,將root left看作新的根節點繼續去找,並...

669 修剪二叉搜尋樹

一道easy題目,但是直接上手有點難度,麻煩的地方在於會改變二叉樹的結構 注意這是一顆二叉搜尋樹,應該能利用到二叉搜尋樹的性質來遍歷 然後給定區間是 lo w,hi gh low,high low,h igh 一顆二叉搜尋樹的定義是左小右大的,那麼一共還是三種情況,設根節點的值是val 則low v...