题目
给出二叉树的根节点 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]]
题解
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
List<TreeNode> ans = new ArrayList<>();//List用于接收答案
Set<Integer> s = new HashSet<>();//Set用于存储删除元素
public List<TreeNode> delNodes(TreeNode root, int[] to_delete) {
for (int x : to_delete) {
s.add(x);
}
if (dfs(root) != null) {
ans.add(root);
}
return ans;
}
private TreeNode dfs(TreeNode root) {
if (root == null) {
return null;
}
root.left = dfs(root.left);
root.right = dfs(root.right);
//判断根节点有没有删除
if (!s.contains(root.val)) {
return root;
}
//判断左节点
if (root.left != null) {
ans.add(root.left);
}
//判断右节点
if (root.right != null) {
ans.add(root.right);
}
return null;
}
}