LeetCode 1110. 刪點成林 (二叉樹節點的刪除)

刪點成林
一個節點要被加入答案,情況應該是它的父親節點要被刪除了,而它自己不會被刪除,這個時候纔可以去添加到答案,並且要注意被刪除節點的更新。

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    vector<TreeNode*> ans;
    vector<TreeNode*> delNodes(TreeNode* root, vector<int>& to_delete) {
        set<int> toDelete(to_delete.begin(),to_delete.end());
        if(!root){
            return ans;
        }
        if(!toDelete.count(root->val)){
            ans.push_back(root);
        }
        helper(nullptr,root,toDelete);
        return ans;
    }
    void helper(TreeNode* par,TreeNode* root,set<int>&toDelete){
        if(!root){
            return;
        }
        if(toDelete.count(root->val)){
            if(root->left && !toDelete.count(root->left->val)){
                ans.push_back(root->left);
            }
            if(root->right && !toDelete.count(root->right->val)){
                ans.push_back(root->right);
            }
            //刪除操作
            if(par){
                if(par->left==root){
                    par->left = nullptr;
                }else if(par->right==root){
                    par->right = nullptr;
                }
            }
            helper(nullptr,root->left,toDelete);
            helper(nullptr,root->right,toDelete);
        }else{
            helper(root,root->left,toDelete);
            helper(root,root->right,toDelete);
        }
        
    }
};

一位網友的思路:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    vector<TreeNode*> ans;
    vector<TreeNode*> delNodes(TreeNode* root, vector<int>& to_delete) {
        set<int> toDetele(to_delete.begin(),to_delete.end());
        helper(root,false,toDetele);
        return ans;
    }
    bool helper(TreeNode* root,bool parentExists,set<int>& toDetele){
        bool del = false;
        if(!root){
            return del;
        }
        del = toDetele.count(root->val);
        // 父節點要刪除,說明父節點就不存在了
        if(helper(root->left,!del,toDetele)){
            root->left = nullptr;
        }
        if(helper(root->right,!del,toDetele)){
            root->right = nullptr;
        }
        //這個節點不要被刪除,並且它的父節點不存在,它才能作爲一顆樹根節點加入答案
        if(!del && !parentExists){
            ans.push_back(root);
        }
        return del;
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章