Leetcode刷题652. 寻找重复的子树

给你一棵二叉树的根节点 root ,返回所有 重复的子树 

对于同一类的重复子树,你只需要返回其中任意 一棵 的根结点即可。

如果两棵树具有 相同的结构 和 相同的结点值 ,则认为二者是 重复 的。

示例 1:

输入:root = [1,2,3,4,null,2,4,null,null,4]

输出:[[2,4],[4]]

示例 2:

输入:root = [2,1,1]
输出:[[1]]

示例 3:

输入:root = [2,2,2,3,null,3,null]
输出:[[2,3],[3]]

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/find-duplicate-subtrees
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

class Solution {
	List<TreeNode> list = new ArrayList<>();
	Map<String, Integer> treeMap = new HashMap<>();

    public List<TreeNode> findDuplicateSubtrees(TreeNode root) {
		//时间复杂度:O(N^2),遍历过程复杂度为O(N),对于每个子树需要构造出与子树同等规模的字符串,复杂度为O(N),所以整体复杂度为O(N^2)
		//空间复杂度:O(N)
		//如何判断一个节点为根的子树存在重复?
		//1.知道自己为根节点的子树长啥样 2.知道其他节点为根节点的子树长啥样
		//定义递归函数将二叉树序列化并通过map保存,判断是否存在重复子树
		traverse(root);
		return list;
	}

	private String traverse(TreeNode root) {
		if (root == null) {
			return "#";
		}
		StringBuilder sb = new StringBuilder();
		sb.append(root.val).append("_").append(traverse(root.left)).append(traverse(root.right));
		String key = sb.toString();
		treeMap.put(key, treeMap.getOrDefault(key, 0) + 1);
		if (treeMap.get(key) == 2) {
			list.add(root);
		}
		return key;
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值