题目:牛牛有一棵n个节点的二叉树,该二叉树每个节点的权值为1。牛牛想要删掉该树其中的k层节点,删除序列为a1,a2…ak。
如有一棵二叉树,删除其中的第3层节点
思路:
层序遍历,遍历时对节点依次进行如下操作:
1.若当前节点上一层应该删除且这一层不用删除,将该节点填入答案。
2.将当前节点左右儿子填入遍历队列。
3.若当前节点下一层需要删除时,断开当前节点左右儿子的连接。
特殊处理:遍历前,将第0层(根节点的上层,在树中不存在)设置为需要删除,在对根节点执行操作1时,若第1层不需要删除,会将根节点填入答案,以免漏掉根节点。
function deleteLevel (root, a) {
//要删除的层数队列,0需要手动添加,否则会漏掉root节点
let set = new Set();
for (let num of a) set.add(num);
set.add(0);
let queue = []
let list = []
queue.push(root);
let depth = 0;
while (queue.length!==0) {
let size = queue.length;
depth++;
while (size-- > 0) {
let node = queue.shift();
if (node.left != null)
queue.push(node.left);
if (node.right != null)
queue.push(node.right);
if (set.has(depth - 1) && !set.has(depth))
list.push(node);
if (!set.has(depth) && set.has(depth + 1)) {
node.left = null;
node.right = null;
}
}
}
return list;
}