1110. Delete Nodes And Return Forest

Recursion

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    vector<TreeNode*> delNodes(TreeNode* root, vector<int>& to_delete)
    {
        vector<TreeNode*> forest;
        unordered_set<int> st(to_delete.begin(), to_delete.end());
        root = helper(root, st, forest);
        if (root) forest.push_back(root);
        return forest;
    }

    TreeNode* helper(TreeNode* node, unordered_set<int>& st, vector<TreeNode*>& forest)
    {
        if (!node) return nullptr;

        node->left = helper(node->left, st, forest);
        node->right = helper(node->right, st, forest);

        if (!st.count(node->val)) return node;

        if (node->left) forest.push_back(node->left);
        if (node->right) forest.push_back(node->right);
        delete node;
        return nullptr;
    }
};
  • T: O(N)O(N)
  • S: O(N)O(N)