题目简介:
给出二叉树的根节点 root
,树上每个节点都有一个不同的值。
如果节点值在 to_delete
中出现,我们就把该节点从树上删去,最后得到一个森林(一些不相交的树构成的集合)。
返回森林中的每棵树。你可以按任意顺序组织答案。
示例 1:
1 2
| 输入:root = [1,2,3,4,5,6,7], to_delete = [3,5] 输出:[[1,2,null,4],[6],[7]]
|
提示:
- 中的节点数最大为
1000
。
- 每个节点都有一个介于
1
到 1000
之间的值,且各不相同。
to_delete.length <= 1000
to_delete
包含一些从 1
到 1000
、各不相同的值。
思路:
首先将需要被删除的结点加入哈希表中
然后进行深搜solve(root, flag)
,flag = 1
表示这是一个新的root
结点,需要被加入res
中。
若遍历到的结点需要被删除,则其左右结点就会形成新的root
结点。
代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
|
class Solution { public:
unordered_map<int, int> del; vector<TreeNode*> res;
TreeNode* solve(TreeNode* root, int flag){
if(!root) return nullptr;
if(del[root->val] == 1){
if(root->left) solve(root->left, 1); if(root->right) solve(root->right, 1); return nullptr; }
if(flag == 1) res.push_back(root);
if(!solve(root->left, 0)) root->left = nullptr; if(!solve(root->right, 0)) root->right = nullptr; return root; }
vector<TreeNode*> delNodes(TreeNode* root, vector<int>& to_delete) { for(auto& num : to_delete) del[num] = 1;
solve(root, 1);
return res; } };
|
写法二:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
|
class Solution { public:
unordered_map<int, int> del; vector<TreeNode*> res;
void solve(TreeNode*& root, int flag) {
if (!root) return;
if (del[root->val] == 1) {
solve(root->left, 1); solve(root->right, 1);
root = nullptr; return; }
if (flag == 1) res.push_back(root);
solve(root->left, 0); solve(root->right, 0); }
vector<TreeNode*> delNodes(TreeNode* root, vector<int>& to_delete) { for(auto& num : to_delete) del[num] = 1;
solve(root, 1);
return res; } };
|