本题要求我们 “去除” 二叉树中的某些点,然后按照任意顺序返回剩余的根结点们(就有点像是把一棵树砍了然后把树枝重新种下的感觉)
本题的难点主要在于,我们要怎么在遍历二叉树的同时把对应节点的引用处理好
首先我们会需要一个遍历函数 delNode
,我们采取迭代的方式遍历
在遍历中,我们需要判断当前节点是否需要被删除:
- 如果不需要则正常遍历
- 如果需要,则要给当前节点的父节点返回 null;然后,在遍历到当前节点的子节点时,需要把他们加到返回的数组中
/**
* 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) {
const result = [];
const delNode = (node, isRoot) => {
if(!node) return null;
// 判断当前节点是否需要被删除
const shouldDel = to_delete.includes(node.val);
// 如果当前节点的上个节点被删除,且当前节点需要保留,则判断当前节点是一个新的根结点,需要返回
if(isRoot && !shouldDel) {
result.push(node);
}
// 正常遍历
node.left = delNode(node.left, shouldDel);
node.right = delNode(node.right, shouldDel);
// 如果当前节点被删除了,需要给当前节点父节点返回 null
return shouldDel ? null : node;
}
delNode(root, true);
return result;
};