题目
Leetcode 1110. 删点成林

思路
剪枝思路:
- 如果是叶子节点满足条件,则直接删除返回nullptr即可
- 如果是非叶子节点满足条件,则返回nullptr,同时将左右子树加入到res
如何想到要用后序遍历呢?
- 当我们进行操作需要知道子树信息时,采用后序
- 当我们只需要知道访问过的节点信息时,采用先序
代码(25.11.28 首刷)
class Solution {
public:
vector<TreeNode*> res;
TreeNode* dfs(TreeNode*root, vector<int>& to_delete){
if(!root) return nullptr;
root->left = dfs(root->left, to_delete);
root->right = dfs(root->right, to_delete);
if(find(to_delete.begin(), to_delete.end(), root->val) != to_delete.end()){
if(root->left) res.push_back(root->left);
if(root->right) res.push_back(root->right);
return nullptr;
}else
return root;
}
vector<TreeNode*> delNodes(TreeNode* root, vector<int>& to_delete) {
root = dfs(root, to_delete);
if(root) res.push_back(root);
return res;
}
};