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