题目名称

给出二叉树的根节点 root,树上每个节点都有一个不同的值。

如果节点值在 to_delete 中出现,我们就把该节点从树上删去,最后得到一个森林(一些不相交的树构成的集合)。

返回森林中的每棵树。你可以按任意顺序组织答案。

示例

输入:words = [“adc”,”wzy”,”abc”]
输入:root = [1,2,3,4,5,6,7], to_delete = [3,5]
输出:[[1,2,null,4],[6],[7]]

输入:root = [1,2,4,null,3], to_delete = [3]
输出:[[1,2,4]]

题解

采用深度优先遍历的方法,从叶子节点开始删起。

生成新的树节点应该满足一下条件

  1. 父节点是需要被删除状态
  2. 当前节点不可被删除
  3. 根节点直接判断是否需要被删除即可

当满足以上节点的时候,就生成了一个新的二叉树

答案

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
/**
* Definition for a binary tree node.
* function TreeNode(val, left, right) {
* this.val = (val===undefined ? 0 : val)
* this.left = (left===undefined ? null : left)
* this.right = (right===undefined ? null : right)
* }
*/
/**
* @param {TreeNode} root
* @param {number[]} to_delete
* @return {TreeNode[]}
*/
var delNodes = function(root, to_delete) {
let frestList = []
if(!to_delete.includes(root.val)) {
frestList.push(root)
}
let dfs = (node, del = to_delete.includes(node.val)) => {
node.left = node.left && dfs(node.left)
node.right = node.right && dfs(node.right)
if(node.left && del && to_delete.indexOf(node.left.val) === -1) {
frestList.push(node.left)
}
if(node.right && del && to_delete.indexOf(node.right.val) === -1) {
frestList.push(node.right)
}
if(del) {
return null
}
return node
}
dfs(root)
return frestList
};