题目描述:
给出二叉树的根节点 root,树上每个节点都有一个不同的值。
如果节点值在 to_delete 中出现,我们就把该节点从树上删去,最后得到一个森林(一些不相交的树构成的集合)。
返回森林中的每棵树。你可以按任意顺序组织答案。
示例:
输入: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、各不相同的值。
思路分析:
涉及树,利用递归求解。对于每一棵树,若其在待删除的结点数组中,且其父节点不在当前森林中,则添加这棵树到当前森林。其中在递归过程可以更新每棵树的左右子树,根据其左右子树的根结点是否在待删除结点数组中进行判断,若在,则当前的树的对应左右子树置为空。
代码:
1 /** 2 * Definition for a binary tree node. 3 * struct TreeNode { 4 * int val; 5 * TreeNode *left; 6 * TreeNode *right; 7 * TreeNode(int x) : val(x), left(NULL), right(NULL) {} 8 * }; 9 */ 10 class Solution { 11 public: 12 unordered_set<int> delete_node; 13 vector<TreeNode*>res; 14 TreeNode* preorder(TreeNode* root, bool n_root) 15 { 16 if(root == nullptr) 17 return nullptr; 18 bool is_delete = delete_node.count(root->val)>0; 19 if(!is_delete && n_root) 20 res.push_back(root); 21 root->left = preorder(root->left, is_delete); 22 root->right = preorder(root->right, is_delete); 23 return is_delete ? nullptr:root; 24 } 25 vector<TreeNode*> delNodes(TreeNode* root, vector<int>& to_delete) { 26 if(root==nullptr) 27 return res; 28 delete_node = unordered_set<int>(to_delete.begin(), to_delete.end()); 29 preorder(root, true); 30 return res; 31 } 32 };