【二叉树】寻找重复的子树

题目描述

给定一棵二叉树 root,返回所有重复的子树。

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

如果两棵树具有相同的结构和相同的结点值,则它们是重复的。

示例1:

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

解题思路 

  1. 这里使用HashMap来做去重处理;
  2. 使用递归来记录每个根节点的字符串;

按照示例1,对每个节点做遍历后效果:

  • 1()()
  • 4(1()())()
  • 1()()
  • 4(1()())()
  • 1()()
  • 2(4(1()())())(1()())
  • 5(4(1()())())(2(4(1()())())(1()()))

其中1()()出现了3次,4(1()())()出现了2次,其他的出现了1次,根据题目要求返回1()() 和 4(1()())()对应的节点。

代码实现

class Solution {
    Set<TreeNode> res = new HashSet<>();
    Map<String, TreeNode> map = new HashMap<String, TreeNode>();

    public List<TreeNode> findDuplicateSubtrees(TreeNode root) {

        dfs(root);

        return new ArrayList<>(res);
    }

    private String dfs(TreeNode root) {

        if (root == null) {
            return "";
        }

        StringBuilder sb = new StringBuilder();
        sb.append(root.val);
        sb.append("(");
        sb.append(dfs(root.left));
        sb.append(")(");
        sb.append(dfs(root.right));
        sb.append(")");

        String s = sb.toString();
        if (map.get(s) != null) {
            res.add(map.get(s));
        } else {
            map.put(s, root);
        }
        return s;
    }

}

总结

这道题是二叉树遍历的变体,考察核心如何遍历每个节点,并且做去重操作;如果有更加简洁、高效的思路欢迎回复。

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值