【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 ) O(n) O(n),其中 n n n是二叉树节点个数
- 空间复杂度 O ( n ) O(n) O(n)
AC代码
C++
class Solution {
private:vector<TreeNode*> ans;unordered_set<int> toDelete;bool dfs(TreeNode* root) { // 是否需要保留rootif (!root) {return false;}bool keepLeft = dfs(root->left);bool keepRight = dfs(root->right);if (toDelete.count(root->val)) { // 删rootif (keepLeft) {ans.push_back(root->left);}if (keepRight) {ans.push_back(root->right);}// delete root;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
# from typing import Optional, Listclass Solution:def dfs(self, root: Optional[TreeNode]) -> bool:if not root:return FalsekeepLeft = self.dfs(root.left)keepRight = self.dfs(root.right)if root.val in self.toDelete: # 删rootif keepLeft:self.ans.append(root.left)if keepRight:self.ans.append(root.right)return Falseelse:root.left = root.left if keepLeft else Noneroot.right = root.right if keepRight else Nonereturn Truedef 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