Return the roots of the trees in the remaining forest. You may return the result in any order.
Input: root = [1,2,3,4,5,6,7], to_delete = [3,5]
Output: [[1,2,null,4],[6],[7]]
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;
}