[Swift]LeetCode669. 修剪二叉搜索树 | Trim a Binary Search Tree
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
➤微信公众号:山青咏芝(shanqingyongzhi)
➤博客园地址:山青咏芝(https://www.cnblogs.com/strengthen/)
➤GitHub地址:https://github.com/strengthen/LeetCode
➤原文地址:https://www.cnblogs.com/strengthen/p/10492482.html
➤如果链接不是山青咏芝的博客园地址,则可能是爬取作者的文章。
➤原文已修改更新!强烈建议点击原文地址阅读!支持作者!支持原创!
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
Given a binary search tree and the lowest and highest boundaries as L
and R
, trim the tree so that all its elements lies in [L, R]
(R >= L). You might need to change the root of the tree, so the result should return the new root of the trimmed binary search tree.
Example 1:
Input: 1 / \ 0 2 L = 1 R = 2 Output: 1 \ 2
Example 2:
Input: 3 / \ 0 4 \ 2 / 1 L = 1 R = 3 Output: 3 / 2 / 1
给定一个二叉搜索树,同时给定最小边界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 / 2 / 1
68ms
1 /** 2 * Definition for a binary tree node. 3 * public class TreeNode { 4 * public var val: Int 5 * public var left: TreeNode? 6 * public var right: TreeNode? 7 * public init(_ val: Int) { 8 * self.val = val 9 * self.left = nil 10 * self.right = nil 11 * } 12 * } 13 */ 14 class Solution { 15 func trimBST(_ root: TreeNode?, _ L: Int, _ R: Int) -> TreeNode? { 16 guard let r = root else { return nil } 17 18 if r.val > R { return trimBST(r.left, L, R) } 19 if r.val < L { return trimBST(r.right, L, R) } 20 21 r.left = trimBST(r.left, L, R) 22 r.right = trimBST(r.right, L, R) 23 24 return r 25 } 26 }
84ms
1 /** 2 * Definition for a binary tree node. 3 * public class TreeNode { 4 * public var val: Int 5 * public var left: TreeNode? 6 * public var right: TreeNode? 7 * public init(_ val: Int) { 8 * self.val = val 9 * self.left = nil 10 * self.right = nil 11 * } 12 * } 13 */ 14 class Solution { 15 func trimBST(_ root: TreeNode?, _ L: Int, _ R: Int) -> TreeNode? { 16 guard let root = root else { 17 return nil 18 } 19 20 var resultTree: TreeNode? = nil 21 preorderTraversal(root) { 22 val in 23 if val >= L && val <= R { 24 resultTree = addNode(resultTree, val) 25 } 26 } 27 return resultTree 28 } 29 } 30 31 func addNode(_ root: TreeNode?, _ val: Int) -> TreeNode { 32 guard let root = root else { 33 return TreeNode(val) 34 } 35 36 if val <= root.val { 37 root.left = addNode(root.left, val) 38 } else { 39 root.right = addNode(root.right, val) 40 } 41 return root 42 } 43 44 func preorderTraversal(_ root: TreeNode?, _ visit: (Int) -> Void) { 45 guard let root = root else { 46 return 47 } 48 visit(root.val) 49 preorderTraversal(root.left, visit) 50 preorderTraversal(root.right, visit) 51 }
96ms
1 /** 2 * Definition for a binary tree node. 3 * public class TreeNode { 4 * public var val: Int 5 * public var left: TreeNode? 6 * public var right: TreeNode? 7 * public init(_ val: Int) { 8 * self.val = val 9 * self.left = nil 10 * self.right = nil 11 * } 12 * } 13 */ 14 class Solution { 15 func trimBST(_ root: TreeNode?, _ L: Int, _ R: Int) -> TreeNode? { 16 guard let r = root else { 17 return nil 18 } 19 if r.val < L { 20 return trimBST(r.right, L, R) 21 } else if r.val > R { 22 return trimBST(r.left, L, R) 23 } 24 r.left = trimBST(r.left, L, R) 25 r.right = trimBST(r.right, L, R) 26 return r 27 } 28 29 func deleteNode(_ node: TreeNode) -> TreeNode?{ 30 if node.left == nil { 31 return node.right 32 } else if node.right == nil { 33 return node.left 34 } else { 35 return insert(root: node.left, node: node.right!) 36 } 37 } 38 39 func insert(root: TreeNode?, node: TreeNode) -> TreeNode { 40 guard var n = root else { 41 return node 42 } 43 44 if node.val < n.val { 45 if n.left == nil { 46 n.left = node 47 } else { 48 n.left = insert(root: n.left, node: node) 49 } 50 } else { 51 if n.right == nil { 52 n.right = node 53 } else { 54 n.right = insert(root: n.right, node: node) 55 } 56 } 57 58 return node 59 } 60 }