leetCode 1110 删点成林(树,后序遍历)

题目链接:点击查看

题目描述:

给定一个整数二叉树和一些整数,求删掉这些整数对应的节点后,剩余的子树。
 
输入输出:
 
输入: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;//自下而上最顶点的节点是处理不到,所以递归完后需要对最顶点的节点做处理 
}

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

在森林中麋了鹿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值