[Swift]LeetCode1110. 删点成林 | Delete Nodes And Return Forest
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
➤微信公众号:山青咏芝(shanqingyongzhi)
➤博客园地址:山青咏芝(https://www.cnblogs.com/strengthen/)
➤GitHub地址:https://github.com/strengthen/LeetCode
➤原文地址:https://www.cnblogs.com/strengthen/p/11112218.html
➤如果链接不是山青咏芝的博客园地址,则可能是爬取作者的文章。
➤原文已修改更新!强烈建议点击原文地址阅读!支持作者!支持原创!
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
Given the root
of a binary tree, each node in the tree has a distinct value.
After deleting all nodes with a value in to_delete
, we are left with a forest (a disjoint union of trees).
Return the roots of the trees in the remaining forest. You may return the result in any order.
Example 1:
Input: root = [1,2,3,4,5,6,7], to_delete = [3,5] Output: [[1,2,null,4],[6],[7]]
Constraints:
- The number of nodes in the given tree is at most
1000
. - Each node has a distinct value between
1
and1000
. to_delete.length <= 1000
to_delete
contains distinct values between1
and1000
.
给出二叉树的根节点 root
,树上每个节点都有一个不同的值。
如果节点值在 to_delete
中出现,我们就把该节点从树上删去,最后得到一个森林(一些不相交的树构成的集合)。
返回森林中的每棵树。你可以按任意顺序组织答案。
示例:
输入:root = [1,2,3,4,5,6,7], to_delete = [3,5] 输出:[[1,2,null,4],[6],[7]]
提示:
- 树中的节点数最大为
1000
。 - 每个节点都有一个介于
1
到1000
之间的值,且各不相同。 to_delete.length <= 1000
to_delete
包含一些从1
到1000
、各不相同的值。
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 var ans = [TreeNode?]() 16 func delNodes(_ root: TreeNode?, _ to_delete: [Int]) -> [TreeNode?] { 17 var root = root 18 if root != nil { 19 if !to_delete.contains(root!.val) { ans.append(root) } 20 traverseDelNodes(&root, Set<Int>(to_delete)) 21 } 22 return ans 23 } 24 25 func traverseDelNodes(_ root: inout TreeNode?, _ to_delete: Set<Int>) { 26 if root == nil { return } 27 if to_delete.contains(root!.val) { 28 if root!.left != nil { 29 if !to_delete.contains(root!.left!.val) { ans.append(root!.left) } 30 traverseDelNodes(&root!.left, to_delete) 31 } 32 33 if root!.right != nil { 34 if !to_delete.contains(root!.right!.val) { ans.append(root!.right) } 35 traverseDelNodes(&root!.right, to_delete) 36 } 37 root = nil 38 return 39 } 40 if root!.left != nil { traverseDelNodes(&root!.left, to_delete) } 41 if root!.right != nil { traverseDelNodes(&root!.right, to_delete) } 42 } 43 }
60ms
1 class Solution { 2 var rootNodes = [TreeNode]() 3 var toDeleteSet: Set<Int>! 4 5 func delNodes(_ root: TreeNode?, _ to_delete: [Int]) -> [TreeNode?] { 6 toDeleteSet = Set<Int>(to_delete) 7 helper(parent: nil, isRight: true, needToAdd: true, node: root) 8 return rootNodes 9 } 10 11 func helper(parent: TreeNode?, isRight: Bool, needToAdd: Bool, node: TreeNode?) { 12 guard let n = node else { return } 13 if toDeleteSet.contains(n.val) { 14 if isRight { 15 parent?.right = nil 16 } else { 17 parent?.left = nil 18 } 19 helper(parent: n, isRight: true, needToAdd: true, node: n.right) 20 helper(parent: n, isRight: false, needToAdd: true, node: n.left) 21 } else { 22 if needToAdd { 23 rootNodes.append(n) 24 } 25 helper(parent: n, isRight: true, needToAdd: false, node: n.right) 26 helper(parent: n, isRight: false, needToAdd: false, node: n.left) 27 } 28 } 29 }
64ms
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 var ans = [TreeNode?]() 16 func delNodes(_ root: TreeNode?, _ to_delete: [Int]) -> [TreeNode?] { 17 var root = root 18 if root != nil { 19 if !to_delete.contains(root!.val) { ans.append(root) } 20 traverseDelNodes(&root, Set<Int>(to_delete)) 21 } 22 return ans 23 } 24 25 func traverseDelNodes(_ root: inout TreeNode?, _ to_delete: Set<Int>) { 26 if root == nil { return } 27 if to_delete.contains(root!.val) { 28 var left = root!.left 29 var right = root!.right 30 root = nil 31 if left != nil { 32 if !to_delete.contains(left!.val) { ans.append(left) } 33 traverseDelNodes(&left, to_delete) 34 } 35 36 if right != nil { 37 if !to_delete.contains(right!.val) { ans.append(right) } 38 traverseDelNodes(&right, to_delete) 39 } 40 return 41 } 42 if root!.left != nil { traverseDelNodes(&root!.left, to_delete) } 43 if root!.right != nil { traverseDelNodes(&root!.right, to_delete) } 44 } 45 }
Runtime: 72 ms
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 var ans:[TreeNode?] = [TreeNode?]() 16 var ds:Set<Int> = Set<Int>() 17 18 func delNodes(_ root: TreeNode?, _ to_delete: [Int]) -> [TreeNode?] { 19 for x in to_delete 20 { 21 ds.insert(x) 22 } 23 dfs(root,1) 24 return ans 25 } 26 27 func dfs(_ v: TreeNode?, _ top:Int) -> TreeNode? 28 { 29 if v == nil 30 { 31 return v 32 } 33 if ds.contains(v!.val) 34 { 35 dfs(v!.left,1) 36 dfs(v!.right,1) 37 return nil 38 } 39 if top != 0 40 { 41 ans.append(v) 42 } 43 v?.left = dfs(v!.left,0) 44 v?.right = dfs(v!.right,0) 45 return v 46 } 47 }
104ms
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 delete(_ root: TreeNode, _ parent: TreeNode?, _ toDel: inout [Int], _ result: inout [TreeNode?]) { 16 var nextParent: TreeNode? = root 17 if let toDelIdx = toDel.firstIndex(of: root.val) { 18 toDel.remove(at: toDelIdx) 19 20 if let parentSteady = parent { 21 if parentSteady.left === root { 22 parentSteady.left = nil 23 } 24 if parentSteady.right === root { 25 parentSteady.right = nil 26 } 27 } 28 nextParent = nil 29 } else if parent == nil { 30 result.append(root) 31 } 32 33 if let nodeLeft = root.left { 34 delete(nodeLeft, nextParent, &toDel, &result) 35 } 36 37 if let nodeRight = root.right { 38 delete(nodeRight, nextParent, &toDel, &result) 39 } 40 } 41 42 func delNodes(_ root: TreeNode?, _ to_delete: [Int]) -> [TreeNode?] { 43 var result: [TreeNode?] = [] 44 if let rootSteady = root { 45 var toDel = to_delete 46 delete(rootSteady, nil, &toDel, &result) 47 } 48 if result.isEmpty { 49 result = [ nil ] 50 } 51 return result 52 } 53 }
176ms
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 delNodes(_ root: TreeNode?, _ to_delete: [Int]) -> [TreeNode?] { 16 //traverse tree, when find node, add left/right child to the results. 17 var results = [TreeNode?]() 18 guard let root = root else {return results} 19 20 var trees = [TreeNode]() 21 trees.append(root) 22 while trees.count > 0 { 23 var tree = trees.removeFirst() 24 if to_delete.contains(tree.val) { 25 //this is not valid tree, no need to add to list, leave it out 26 if let left = tree.left { 27 trees.append(left) 28 } 29 if let right = tree.right { 30 trees.append(right) 31 } 32 } else { 33 results.append(tree) 34 dfs(tree, to_delete, &trees) 35 } 36 } 37 38 39 return results 40 } 41 42 func dfs(_ node: TreeNode?, _ toDelete: [Int], _ trees: inout [TreeNode]) { 43 guard let node = node else {return} 44 45 if let left = node.left { 46 if toDelete.contains(left.val) { 47 trees.append(left) 48 node.left = nil 49 } else { 50 dfs(node.left, toDelete, &trees) 51 } 52 } 53 54 if let right = node.right { 55 if toDelete.contains(right.val) { 56 trees.append(right) 57 node.right = nil 58 } else { 59 dfs(node.right, toDelete, &trees) 60 } 61 } 62 63 } 64 }
转载于:https://www.cnblogs.com/strengthen/p/11112218.html
[Swift]LeetCode1110. 删点成林 | Delete Nodes And Return Forest相关推荐
- Leetcode 1110.删点成林(Delete Nodes And Return Forest)
Leetcode 1110.删点成林 1 题目描述(Leetcode题目链接) 给出二叉树的根节点 root,树上每个节点都有一个不同的值. 如果节点值在 to_delete 中出现,我们就把该节 ...
- Delete Nodes And Return Forest(C++删点成林)
解题思路: (1)后序遍历,将删除节点置空 (2)存储删除节点的左右子节点 /*** Definition for a binary tree node.* struct TreeNode {* in ...
- Leetcode(1110)——删点成林
Leetcode(1110)--删点成林 题目 给出二叉树的根节点 root,树上每个节点都有一个不同的值. 如果节点值在 to_delete 中出现,我们就把该节点从树上删去,最后得到一个森林(一些 ...
- leetcode 111.删点成林 C++
leetcode 111.删点成林 C++ 删点成林 题目描述 示例 提示 解题思路 C++代码 注意事项 删点成林 题目描述 给出二叉树的根节点 root,树上每个节点都有一个不同的值. 如果节点值 ...
- 2021.04.29删点成林
2021.04.29删点成林 (题目来源:https://leetcode-cn.com/problems/delete-nodes-and-return-forest/) 题目描述 给出二叉树的根节 ...
- 2022-5-18[树] 后继者, 检查子树, 删点成林, 树的深度
1. 后继者 设计一个算法,找出二叉搜索树中指定节点的"下一个"节点(也即中序后继). 如果指定节点没有对应的"下一个"节点,则返回nullptr. 示例 示例 ...
- PigyChan_LeetCode 1110. 删点成林
1110. 删点成林 难度中等 给出二叉树的根节点 root,树上每个节点都有一个不同的值. 如果节点值在 to_delete 中出现,我们就把该节点从树上删去,最后得到一个森林(一些不相交的树构成的 ...
- 2023-05-23 LeetCode每日一题(删点成林)
2023-05-30每日一题 一.题目编号 1110. 删点成林 二.题目链接 点击跳转到题目位置 三.题目描述 给出二叉树的根节点 root,树上每个节点都有一个不同的值. 如果节点值在 to_de ...
- LeetCode 刷题系列 -- 1110. 删点成林
给出二叉树的根节点 root,树上每个节点都有一个不同的值. 如果节点值在 to_delete 中出现,我们就把该节点从树上删去,最后得到一个森林(一些不相交的树构成的集合). 返回森林中的每棵树.你 ...
最新文章
- Linux搜索查找命令合集
- ABAP实现本地化的资产负债表和损益表
- Linux下paste命令详解
- 解决memcached不能远程访问的问题
- c语言程序设计和数据结构,C语言程序设计与数据结构实践 闵光太主编.pdf
- iOS13 一次Crash定位 - 被释放的NSURL.host
- A*算法(一)算法导言
- 北大博士,毕业做北京城管,他的同事清一色名校硕士,博士,这个世界怎么了?...
- 并发相关随笔(持续更新)
- MODIS、VIIRS数据下载教程
- centos 7.7.1908上隐藏顶栏和任务栏
- python十六进制转十进制_python实现进制转换(二、八、十六进制;十进制)
- mysql in查询效率真的低_MySql中in查询效率低的替代方法
- jy-10-SPRINGMYBATIS01——Spring-成恒
- 计算某天是星期几-泽勒算法
- 十大算法之迪杰斯特拉算法
- Unity自定义Script模板
- 知网研学打不开?一片空白怎么办?一步解决
- [绍棠] iOS视频播放AVPlayer的视频内容拉伸设置
- Python - 如何用turtle库画一个微笑表情包
热门文章
- java里面string什么意思_「Java基础知识」Java中的字符串是什么
- 漏电继电器JOLX-GS62零序孔径Φ100
- shuffle阶段做了什么?什么是shuffle阶段?
- 解决Windows缺少mscomct2.ocx无法运行程序问题
- 阿里云短信服务 isv.INVALID_JSON_PARAM
- 我的世界的‘’Herobrine‘’伪装指令(最新版)
- 时区少8个小时的问题的一次排查
- Ubuntu14.04安装原生迅雷
- linux fedora分区,Fedora32双系统安装分区教程
- 题解-今日头条2018校招后端方向(第二批)