2021.04.29删点成林
(题目来源:https://leetcode-cn.com/problems/delete-nodes-and-return-forest/)
题目描述
给出二叉树的根节点 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、各不相同的值。
思路
考到二叉树的题目大多数采用递归思想进行遍历。
代码
List<TreeNode> res = new ArrayList<>();
Set<Integer> set = new HashSet<>();
public List<TreeNode> delNodes(TreeNode root, int[] to_delete) {
for(int x: to_delete)
set.add(x);
if(!set.contains(root.val))
res.add(root);
dfs(root);
return res;
}
TreeNode dfs(TreeNode root) {
if(root == null) return null;
root.left = dfs(root.left);
root.right = dfs(root.right);
if(set.contains(root.val)) {
if(root.left != null) {
res.add(root.left);
}
if(root.right != null) {
res.add(root.right);
}
root = null;
}
return root;
}