leetcode 1110. 删点成林

题目描述:

给出二叉树的根节点 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 };
原文地址:https://www.cnblogs.com/LJ-LJ/p/11435137.html