删点成林 一个节点要被加入答案,情况应该是它的父亲节点要被删除了,而它自己不会被删除,这个时候才可以去添加到答案,并且要注意被删除节点的更新。
/** * 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; } };