Leet Code Daily 2024-07-17 - Delete Nodes and Return Forest
Code
● ● ●c++/**
* 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) {}
* };
*/
constexpr int kDeletedValue = -1;
class Solution {
public:
void scan(TreeNode* root, unordered_map<int, TreeNode*>& parent_map,
unordered_map<int, TreeNode*>& node_map) {
if (root == nullptr) {
return;
}
node_map[root->val] = root;
if (root->left != nullptr) {
parent_map[root->left->val] = root;
scan(root->left, parent_map, node_map);
}
if (root->right != nullptr) {
parent_map[root->right->val] = root;
scan(root->right, parent_map, node_map);
}
}
vector<TreeNode*> delNodes(TreeNode* root, vector<int>& to_delete) {
unordered_map<int, TreeNode*> parent_map, node_map;
scan(root, parent_map, node_map);
for (const auto& val : to_delete) {
node_map[val]->val = kDeletedValue;
if (!parent_map.contains(val)) {
continue;
}
if (parent_map[val]->left == node_map[val]) {
parent_map[val]->left = nullptr;
}
if (parent_map[val]->right == node_map[val]) {
parent_map[val]->right = nullptr;
}
}
vector<TreeNode*> ret;
if (root->val != kDeletedValue) {
ret.push_back(root);
}
for (const auto& pair : parent_map) {
if (node_map[pair.first]->val != kDeletedValue &&
pair.second->val == kDeletedValue) {
ret.push_back(node_map[pair.first]);
}
}
return ret;
}
};