思路分析: 這道題與 leetcode 刪除二叉搜尋樹中的節點 非常類似,但是相比之下簡單很多。
首先,我們知道二叉搜尋樹的定義是:左子樹的節點元素值 < root的值 < 右子樹的節點元素值,並且左子樹、右子樹同樣滿足這個條件(遞迴定義)。
演算法描述:
如果root的值 < l,說明,root和root->left都需要刪除(因為左子樹的節點元素值 < root的值 < l)
如果r < root的值,說明,root和root->right都需要刪除(因為r < root的值 < 右子樹的節點元素值)
否則,我們遞迴修剪root->left、root->right,然後放到root的左子樹、右子樹
遞迴演算法一般比較簡潔,但是理解可能比較困難。我們不要深究每一步是怎麼實現的,我們只要知道如果root的值不需要刪減,就遞迴刪減root->left,root->right,否則會越想越複雜。
# definition for a binary tree node.
# class treenode:
# def __init__(self, x):
# self.val = x
# self.left = none
# self.right = none
class solution:
def trimbst(self, root: treenode, l: int, r: int) -> treenode:
if root==none:
return none
if root.valr:
return self.trimbst(root.left,l,r)
# 屬於[l,r]則保留
root.left=self.trimbst(root.left,l,r)
root.right=self.trimbst(root.right,l,r)
return root
LeetCode 669 修剪二叉搜尋樹
給定乙個二叉搜尋樹,同時給定最小邊界l 和最大邊界 r。通過修剪二叉搜尋樹,使得所有節點的值在 l,r 中 r l 你可能需要改變樹的根節點,所以結果應當返回修剪好的二叉搜尋樹的新的根節點。如果當前節點值大於r,則說明該節點的右子樹都大於r 所以可直接捨棄該節點的右子樹,然後再繼續往左子樹 找打 r...
leetcode 669 修剪二叉搜尋樹
給定乙個二叉搜尋樹,同時給定最小邊界l和最大邊界r。通過修剪二叉搜尋樹,使得所有節點的值在 l,r 中 r l 你可能需要改變樹的根節點,所以結果應當返回修剪好的二叉搜尋樹的新的根節點。示例 1 輸入 1 0 2 l 1 r 2輸出 1 2示例 2 輸入 3 0 4 2 1 l 1 r 3輸出 3 ...
leetcode 669 修剪二叉搜尋樹
思路 由於二叉搜尋樹的性質 1.當root小於下界值l時,應該採取的是以root的right作為根節點去修剪 相當於扔掉root,以左孩子重新為root 2.當root大於上界r時,應該採取的時以root的left作為根節點去修剪 相當於扔掉root,以右孩子重新為root 3.當root滿足時,不...