专门做摩托车的网站,苏州企业网站设计开发,微信公众号登录入口在哪,创意设计服务是什么1. 题目
给出二叉树的根节点 root#xff0c;树上每个节点都有一个不同的值。
如果节点值在 to_delete 中出现#xff0c;我们就把该节点从树上删去#xff0c;最后得到一个森林#xff08;一些不相交的树构成的集合#xff09;。
返回森林中的每棵树。你可以按任意顺序…1. 题目
给出二叉树的根节点 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、各不相同的值。来源力扣LeetCode 链接https://leetcode-cn.com/problems/delete-nodes-and-return-forest 著作权归领扣网络所有。商业转载请联系官方授权非商业转载请注明出处。 2. 解题
要删除的放入哈希表方便快速查找递归遍历记录父节点和左右方向如果要删除断开父节点子节点遍历子节点不删除且父节点为空加入答案
class Solution {unordered_setint s;vectorTreeNode* ans;
public:vectorTreeNode* delNodes(TreeNode* root, vectorint to_delete) {if(!root)return {};for(int del : to_delete)s.insert(del);//哈希快速查找order(root, NULL, 0);return ans;}void order(TreeNode* root, TreeNode* father, int dir){ //参数当前节点其父节点是父节点的左节点还是右节点if(!root)return;if(s.count(root-val))//root需要删除{if(father)//要删除的节点有父节点{if(dir0)//是左边过来的father-left NULL;//断开与父节点的链接elsefather-right NULL;}TreeNode *l root-left, *r root-right;//当前节点的左右子节点root-left NULL;//断开子的链接root-right NULL;//断开子的链接order(l, NULL, 0);//遍历左子其父节点断开了为空第三个参数随意order(r, NULL, 0);//遍历右子}else//root不用删除{if(!father)//如果没有父节点了,新的树根加入答案ans.push_back(root);order(root-left, root, 0);//遍历左子第三个参数0表示左order(root-right, root, 1);//遍历右子第三个参数1表示右}}
};