重点在于递归函数的返回值以及传入的参数rootDeleted,返回值表示当前node有没有被删掉,这是告诉parent要不要切断edge,也就是把child设为null,rootDeleted用来决定当前的node是不是新的root,只有它没被删掉而且它的parent都被删掉了它才会是新的root
/**
* 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 {
public List<TreeNode> delNodes(TreeNode root, int[] to_delete) {
Set<Integer> toDelete = new HashSet<>();
for (int d : to_delete) toDelete.add(d);
List<TreeNode> ans = new ArrayList<>();
del(root, ans, toDelete, true);
return ans;
}
// return true if this root is deleted
private boolean del(TreeNode root, List<TreeNode> list, Set<Integer> toDel, boolean rootDeleted) {
if (root == null) return false;
if (toDel.contains(root.val)) {
del(root.left, list, toDel, true);
del(root.right, list, toDel, true);
return true;
} else {
if (del(root.left, list, toDel, false)) {
root.left = null;
}
if (del(root.right, list, toDel, false)) {
root.right = null;
}
if (rootDeleted) list.add(root);
return false;
}
}
}