【LetMeFly】1110.删点成林
力扣题目链接:https://leetcode.cn/problems/delete-nodes-and-return-forest/
给出二叉树的根节点 root
,树上每个节点都有一个不同的值。
如果节点值在 to_delete
中出现,我们就把该节点从树上删去,最后得到一个森林(一些不相交的树构成的集合)。
返回森林中的每棵树。你可以按任意顺序组织答案。
示例 1:
输入:root = [1,2,3,4,5,6,7], to_delete = [3,5]
输出:[[1,2,null,4],[6],[7]]
示例 2:
输入:root = [1,2,4,null,3], to_delete = [3]
输出:[[1,2,4]]
提示:
- 树中的节点数最大为
1000
。
- 每个节点都有一个介于
1
到 1000
之间的值,且各不相同。
to_delete.length <= 1000
to_delete
包含一些从 1
到 1000
、各不相同的值。
方法一:深度优先搜索DFS
写一个函数dfs(root),返回root节点是否需要保留,并递归判断root的左右子是否需要保留。
- 如果root不需要保留,但左右子中有需要保留的,则需要保留的字节的将称为新的根节点(加入到答案的根节点数组中)。
- 否则(root需要保留),如果root的子节点不需要保留,则修改root的子节点为空。
就可以了。
- 时间复杂度$O(n)$,其中$n$是二叉树节点个数
- 空间复杂度$O(n)$
AC代码
C++
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| class Solution { private: vector<TreeNode*> ans; unordered_set<int> toDelete;
bool dfs(TreeNode* root) { if (!root) { return false; } bool keepLeft = dfs(root->left); bool keepRight = dfs(root->right); if (toDelete.count(root->val)) { if (keepLeft) { ans.push_back(root->left); } if (keepRight) { ans.push_back(root->right); } return false; } else { root->left = keepLeft ? root->left : nullptr; root->right = keepRight ? root->right : nullptr; return true; } } public: vector<TreeNode*> delNodes(TreeNode* root, vector<int>& to_delete) { for (int t : to_delete) { toDelete.insert(t); } if (dfs(root)) { ans.push_back(root); } return ans; } };
|
Python
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
|
class Solution: def dfs(self, root: Optional[TreeNode]) -> bool: if not root: return False keepLeft = self.dfs(root.left) keepRight = self.dfs(root.right) if root.val in self.toDelete: if keepLeft: self.ans.append(root.left) if keepRight: self.ans.append(root.right) return False else: root.left = root.left if keepLeft else None root.right = root.right if keepRight else None return True def delNodes(self, root: Optional[TreeNode], to_delete: List[int]) -> List[TreeNode]: self.ans = [] self.toDelete = set() for t in to_delete: self.toDelete.add(t) if self.dfs(root): self.ans.append(root) return self.ans
|
同步发文于CSDN,原创不易,转载请附上原文链接哦~
Tisfy:https://letmefly.blog.csdn.net/article/details/130941100