给出二叉树的根节点 root,树上每个节点都有一个不同的值。
/**
* 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*> delNodes(TreeNode* root, vector<int>& to_delete) {
vector<TreeNode*> res;
if(root == nullptr)
return res;
//对第一个点尽心单独判断,如果没有,则加入到结果中
bool bHave=false;
for(size_t i=0; i<to_delete.size(); i++)
{
if(to_delete[i] == root->val)
{
bHave = true;
break;
}
}
if(!bHave) res.push_back(root);
//遍历求结果
DeleteNodes(root,to_delete,res);
return res;
}
//后序遍历求结果,注意node传入的是指针,用于置空要删除的结点
void DeleteNodes(TreeNode*& node, vector<int>& toDelete, vector<TreeNode*>& res)
{
if(node == nullptr)
return;
DeleteNodes(node->left,toDelete,res);
DeleteNodes(node->right,toDelete,res);
for(size_t i=0; i<toDelete.size(); i++)
{
if(toDelete[i] == node->val)
{
if(node->left) res.push_back(node->left); //添加结果
if(node->right) res.push_back(node->right);
toDelete.erase(toDelete.begin()+i); //从队列中删除已被删除的值
node = nullptr; //将当前删除的结点指针引用置空
break;
}
}
}
};
如果节点值在 to_delete 中出现,我们就把该节点从树上删去,最后得到一个森林(一些不相交的树构成的集合)。
返回森林中的每棵树。你可以按任意顺序组织答案。
示例:
输入:root = [1,2,3,4,5,6,7], to_delete = [3,5]
输出:[[1,2,null,4],[6],[7]]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/delete-nodes-and-return-forest
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路:
二叉树的后序遍历
代码如下: