题目链接:点击查看
题目描述:
给定一个整数二叉树和一些整数,求删掉这些整数对应的节点后,剩余的子树。
输入输出:
输入:root = [1,2,3,4,5,6,7], to_delete = [3,5] 输出:[[1,2,null,4],[6],[7]]
题目分析:
这道题最主要需要注意的细节是如果通过递归处理原树,以及需要在什么时候断开指针。同时,为了便于寻找待删除节点,可以建立一个哈希表方便查找。
代码:
vector<TreeNode *>delNodes(TreeNode *root,vector<int>&to_delete)
{
vector<TreeNode*>forest;
unordered_set<int>dict(to_delete.begin(),to_delete.end());
root=helper(root,dict,forest);
if(root)//对树顶部的节点进行操作
{
forest.push_back(root);
}
return forest;//按题目要求最后返回的是一个数组
}
TreeNode *helper(TreeNode*root,unordered_set<int>&dict,vector<TreeNode*>&forest)
{
if(!root)
{
return root;
}
root->left=helper(root->left,dict,forest);//先进行递归操作 目的是自下而上对树进行操作 即树的后序遍历
root->right=helper(root->right,dict,forest);
if(dict.count(root->val))//如果存在一个节点的val值存在于to_delete数组中
{
if(root->left)
{
forest.push_back(root->left);//把当前的左右子树 压入forest数组中
}
if(root->right)
{
forest.push_back(root->right);
}
root=NULL;//删除当前节点
}
return root;//自下而上最顶点的节点是处理不到,所以递归完后需要对最顶点的节点做处理
}