2021.04.29删点成林

2021.04.29删点成林

(题目来源:https://leetcode-cn.com/problems/delete-nodes-and-return-forest/)

题目描述

给出二叉树的根节点 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、各不相同的值。

思路

考到二叉树的题目大多数采用递归思想进行遍历。

代码

	List<TreeNode> res = new ArrayList<>();
	Set<Integer> set = new HashSet<>();
	public List<TreeNode> delNodes(TreeNode root, int[] to_delete) {
		for(int x: to_delete)
			set.add(x);
		if(!set.contains(root.val))
			res.add(root);
		dfs(root);
		return res;
	}
	TreeNode dfs(TreeNode root) {
		if(root == null) return null;
		root.left = dfs(root.left);
		root.right = dfs(root.right);
		if(set.contains(root.val)) {
			if(root.left != null) {
				res.add(root.left);
			}
			if(root.right != null) {
				res.add(root.right);
			}
			root = null;
		}
		return root;
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值