/**
 * Definition for a binary tree node.
 * function TreeNode(val) {
 *     this.val = val;
 *     this.left = this.right = null;
 * }
 */
/**
 * @param {TreeNode} root
 * @param {number[]} to_delete
 * @return {TreeNode[]}
 */
var delNodes = function (root, to_delete) {
	if (!root) return []
	const remaining = [],
		queue = [root]

	while (queue.length) {
		const curr = queue.shift(),
			delLen = to_delete.length,
			left = curr.left,
			right = curr.right
		let delI = null

		for (let i = 0; i < delLen; i++) {
			if (to_delete[i] === curr.val) {
				delI = i
				break
			}
		}

		if (delI === null) {
			if (!curr.parentL && !curr.parentR) remaining.push(curr)
			if (left) curr.left.parentL = curr
			if (right) curr.right.parentR = curr
		} else {
			if (left) curr.left = null
			if (right) curr.right = null
			if (curr.parentR) curr.parentR.right = null
			if (curr.parentL) curr.parentL.left = null
		}
		if (left) queue.push(left)
		if (right) queue.push(right)
	}
	return remaining
}
// https://leetcode.com/problems/delete-nodes-and-return-forest/discuss/328924/Javascript-Solution
var delNodes = function (root, to_delete) {
	if (!root) return []
	const res = [],
		dfs = (node, isRoot) => {
			if (!node) return
			let isNodeDeleted = to_delete.includes(node.val)
			if (node.left) node.left = dfs(node.left, isNodeDeleted)
			if (node.right) node.right = dfs(node.right, isNodeDeleted)
			if (isRoot && !isNodeDeleted) res.push(node)
			return isNodeDeleted ? null : node
		}
	dfs(root, true)
	return res
}
//Test cases
console.log(
	delNodes(
		{
			val: 1,
			right: {
				val: 3,
				right: { val: 7, right: null, left: null },
				left: { val: 6, right: null, left: null },
			},
			left: {
				val: 2,
				right: { val: 5, right: null, left: null },
				left: { val: 4, right: null, left: null },
			},
		},
		[3, 5]
	)
)
console.log('----------')
console.log(
	delNodes(
		{
			val: 1,
			right: null,
			left: {
				val: 2,
				right: { val: 3, right: null, left: null },
				left: { val: 4, right: null, left: null },
			},
		},
		[2, 3]
	)
)
// [1,2,3,4,5,6,7]
// [3,5]

// [1,2,null,4,3]
// [2,3]