给出二叉树的根节点 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、各不相同的值。
1110. 删点成林 - 力扣(Leetcode)
思路:
本题是后续遍历,自底向上处理。在处理完当前节点的左右节点后,再处理当前节点。
对于当前节点的处理:若是当前节点在删除名单中,若是当前节点的左子节点或者右子节点不为空,那么将左子节点或者右子节点压入结果中,并返回空指针(意味着当前节点被删除);否则返回当前节点
java:
/**
* 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> result = new LinkedList<>();
public List<TreeNode> delNodes(TreeNode root, int[] to_delete) {
HashSet<Integer> set = new HashSet<>();
for(int dd:to_delete) {
set.add(dd);
}
TreeNode newRoot = dfsNodes(root, set);
if(newRoot != null) {
result.add(newRoot);
}
return result;
}
TreeNode dfsNodes(TreeNode root, HashSet<Integer> set) {
if(root == null) {
return null;
}
root.left = dfsNodes(root.left, set);
root.right = dfsNodes(root.right, set);
if(set.contains(root.val)) {
if(root.left != null) {
result.add(root.left);
}
if(root.right != null) {
result.add(root.right);
}
return null;
}
return root;
}
}