1110. Delete Nodes And Return Forest
Given the root
of a binary tree, each node in the tree has a distinct value.
After deleting all nodes with a value in to_delete
, we are left with a forest (a disjoint union of trees).
Return the roots of the trees in the remaining forest. You may return the result in any order.
Example 1:

Input: root = [1,2,3,4,5,6,7], to_delete = [3,5]
Output: [[1,2,null,4],[6],[7]]
Constraints:
The number of nodes in the given tree is at most
1000
.Each node has a distinct value between
1
and1000
.to_delete.length <= 1000
to_delete
contains distinct values between1
and1000
.
TreeNode* helper(TreeNode* node, unordered_set<int>& to_delete_st, vector<TreeNode*>& res, bool is_root) {
if (!node) return nullptr;
bool deleted = to_delete_st.count(node->val);
if (is_root && !deleted) res.push_back(node);
// If the current node is deleted, its children will become new roots for other subtrees
node->left = helper(node->left, to_delete_st, res, deleted);
node->right = helper(node->right, to_delete_st, res, deleted);
return deleted ? nullptr : node;
}
vector<TreeNode*> delNodes(TreeNode* root, vector<int>& to_delete) {
unordered_set<int> to_delete_st(to_delete.begin(), to_delete.end());
vector<TreeNode*> res;
helper(root, to_delete_st, res, true);
return res;
}
TreeNode* helper(TreeNode* node, unordered_set<int>& to_delete_st, vector<TreeNode*>& res) {
if (!node) return nullptr;
node->left = helper(node->left, to_delete_st, res);
node->right = helper(node->right, to_delete_st, res);
if (to_delete_st.count(node->val)) {
if (node->left) {
res.push_back(node->left);
node->left = nullptr;
}
if (node->right) {
res.push_back(node->right);
node->right = nullptr;
}
return nullptr;
} else {
return node;
}
}
vector<TreeNode*> delNodes(TreeNode* root, vector<int>& to_delete) {
unordered_set<int> to_delete_st(to_delete.begin(), to_delete.end());
vector<TreeNode*> res;
if (!to_delete_st.count(root->val)) res.push_back(root);
helper(root, to_delete_st, res);
return res;
}
Last updated
Was this helpful?