diff --git a/solution/1100-1199/1110.Delete Nodes And Return Forest/README.md b/solution/1100-1199/1110.Delete Nodes And Return Forest/README.md index e48d1ae455c55..2a844c68816c2 100644 --- a/solution/1100-1199/1110.Delete Nodes And Return Forest/README.md +++ b/solution/1100-1199/1110.Delete Nodes And Return Forest/README.md @@ -298,6 +298,180 @@ function delNodes(root: TreeNode | null, to_delete: number[]): Array { + if (!root) { + return null; + } + root.left = dfs(root.left); + root.right = dfs(root.right); + if (!s[root.val]) { + return root; + } + if (root.left) { + ans.push(root.left); + } + if (root.right) { + ans.push(root.right); + } + return null; + }; + if (dfs(root)) { + ans.push(root); + } + return ans; +}; +``` + + + + + + + +### 方法二:BFS + + + +#### TypeScript + +```ts +/** + * Definition for a binary tree node. + * class TreeNode { + * val: number + * left: TreeNode | null + * right: TreeNode | null + * constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) { + * this.val = (val===undefined ? 0 : val) + * this.left = (left===undefined ? null : left) + * this.right = (right===undefined ? null : right) + * } + * } + */ +export function delNodes(root: T, to_delete: number[]): Array { + if (!root) return []; + + const del = new Set(to_delete); + const res: T[] = []; + let q: TreeNode[] = [root]; + + while (q.length) { + const qNext: TreeNode[] = []; + + for (const node of q) { + if (node.left) { + qNext.push(node.left); + + if (del.has(node.left.val)) { + node.left = null; + } + } + + if (node.right) { + qNext.push(node.right); + + if (del.has(node.right.val)) { + node.right = null; + } + } + + if (del.has(node.val)) { + if (node.left) res.push(node.left); + if (node.right) res.push(node.right); + } + } + + q = qNext; + } + + if (!del.has(root.val)) res.push(root); + + return res; +} + +type T = TreeNode | null; +``` + +#### JavaScript + +```js +/** + * 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) { + if (!root) return []; + + const del = new Set(to_delete); + const res = []; + let q = [root]; + + while (q.length) { + const qNext = []; + + for (const node of q) { + if (node.left) { + qNext.push(node.left); + + if (del.has(node.left.val)) { + node.left = null; + } + } + + if (node.right) { + qNext.push(node.right); + + if (del.has(node.right.val)) { + node.right = null; + } + } + + if (del.has(node.val)) { + if (node.left) res.push(node.left); + if (node.right) res.push(node.right); + } + } + + q = qNext; + } + + if (!del.has(root.val)) res.push(root); + + return res; +}; +``` + diff --git a/solution/1100-1199/1110.Delete Nodes And Return Forest/README_EN.md b/solution/1100-1199/1110.Delete Nodes And Return Forest/README_EN.md index d134bbac3d5fb..80f97a2106795 100644 --- a/solution/1100-1199/1110.Delete Nodes And Return Forest/README_EN.md +++ b/solution/1100-1199/1110.Delete Nodes And Return Forest/README_EN.md @@ -294,6 +294,180 @@ function delNodes(root: TreeNode | null, to_delete: number[]): Array { + if (!root) { + return null; + } + root.left = dfs(root.left); + root.right = dfs(root.right); + if (!s[root.val]) { + return root; + } + if (root.left) { + ans.push(root.left); + } + if (root.right) { + ans.push(root.right); + } + return null; + }; + if (dfs(root)) { + ans.push(root); + } + return ans; +}; +``` + + + + + + + +### Solution 2: BFS + + + +#### TypeScript + +```ts +/** + * Definition for a binary tree node. + * class TreeNode { + * val: number + * left: TreeNode | null + * right: TreeNode | null + * constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) { + * this.val = (val===undefined ? 0 : val) + * this.left = (left===undefined ? null : left) + * this.right = (right===undefined ? null : right) + * } + * } + */ +export function delNodes(root: T, to_delete: number[]): Array { + if (!root) return []; + + const del = new Set(to_delete); + const res: T[] = []; + let q: TreeNode[] = [root]; + + while (q.length) { + const qNext: TreeNode[] = []; + + for (const node of q) { + if (node.left) { + qNext.push(node.left); + + if (del.has(node.left.val)) { + node.left = null; + } + } + + if (node.right) { + qNext.push(node.right); + + if (del.has(node.right.val)) { + node.right = null; + } + } + + if (del.has(node.val)) { + if (node.left) res.push(node.left); + if (node.right) res.push(node.right); + } + } + + q = qNext; + } + + if (!del.has(root.val)) res.push(root); + + return res; +} + +type T = TreeNode | null; +``` + +#### JavaScript + +```js +/** + * 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) { + if (!root) return []; + + const del = new Set(to_delete); + const res = []; + let q = [root]; + + while (q.length) { + const qNext = []; + + for (const node of q) { + if (node.left) { + qNext.push(node.left); + + if (del.has(node.left.val)) { + node.left = null; + } + } + + if (node.right) { + qNext.push(node.right); + + if (del.has(node.right.val)) { + node.right = null; + } + } + + if (del.has(node.val)) { + if (node.left) res.push(node.left); + if (node.right) res.push(node.right); + } + } + + q = qNext; + } + + if (!del.has(root.val)) res.push(root); + + return res; +}; +``` + diff --git a/solution/1100-1199/1110.Delete Nodes And Return Forest/Solution.js b/solution/1100-1199/1110.Delete Nodes And Return Forest/Solution.js new file mode 100644 index 0000000000000..18c1bee863d03 --- /dev/null +++ b/solution/1100-1199/1110.Delete Nodes And Return Forest/Solution.js @@ -0,0 +1,41 @@ +/** + * 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 s = Array(1001).fill(false); + for (const x of to_delete) { + s[x] = true; + } + const ans = []; + const dfs = root => { + if (!root) { + return null; + } + root.left = dfs(root.left); + root.right = dfs(root.right); + if (!s[root.val]) { + return root; + } + if (root.left) { + ans.push(root.left); + } + if (root.right) { + ans.push(root.right); + } + return null; + }; + if (dfs(root)) { + ans.push(root); + } + return ans; +}; diff --git a/solution/1100-1199/1110.Delete Nodes And Return Forest/Solution2.js b/solution/1100-1199/1110.Delete Nodes And Return Forest/Solution2.js new file mode 100644 index 0000000000000..3c37a6ebb7bf2 --- /dev/null +++ b/solution/1100-1199/1110.Delete Nodes And Return Forest/Solution2.js @@ -0,0 +1,53 @@ +/** + * 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) { + if (!root) return []; + + const del = new Set(to_delete); + const res = []; + let q = [root]; + + while (q.length) { + const qNext = []; + + for (const node of q) { + if (node.left) { + qNext.push(node.left); + + if (del.has(node.left.val)) { + node.left = null; + } + } + + if (node.right) { + qNext.push(node.right); + + if (del.has(node.right.val)) { + node.right = null; + } + } + + if (del.has(node.val)) { + if (node.left) res.push(node.left); + if (node.right) res.push(node.right); + } + } + + q = qNext; + } + + if (!del.has(root.val)) res.push(root); + + return res; +}; diff --git a/solution/1100-1199/1110.Delete Nodes And Return Forest/Solution2.ts b/solution/1100-1199/1110.Delete Nodes And Return Forest/Solution2.ts new file mode 100644 index 0000000000000..947201cade91c --- /dev/null +++ b/solution/1100-1199/1110.Delete Nodes And Return Forest/Solution2.ts @@ -0,0 +1,55 @@ +/** + * Definition for a binary tree node. + * class TreeNode { + * val: number + * left: TreeNode | null + * right: TreeNode | null + * constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) { + * this.val = (val===undefined ? 0 : val) + * this.left = (left===undefined ? null : left) + * this.right = (right===undefined ? null : right) + * } + * } + */ +export function delNodes(root: T, to_delete: number[]): Array { + if (!root) return []; + + const del = new Set(to_delete); + const res: T[] = []; + let q: TreeNode[] = [root]; + + while (q.length) { + const qNext: TreeNode[] = []; + + for (const node of q) { + if (node.left) { + qNext.push(node.left); + + if (del.has(node.left.val)) { + node.left = null; + } + } + + if (node.right) { + qNext.push(node.right); + + if (del.has(node.right.val)) { + node.right = null; + } + } + + if (del.has(node.val)) { + if (node.left) res.push(node.left); + if (node.right) res.push(node.right); + } + } + + q = qNext; + } + + if (!del.has(root.val)) res.push(root); + + return res; +} + +type T = TreeNode | null;