刷完LeetCode题库——652. 寻找重复的子树

97 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第2天,点击查看活动详情

题目详情

LeetCode题库序号 652. 寻找重复的子树 ,难度为 中等

Tag : 「深度优先搜索」 给定一棵二叉树 root,返回所有重复的子树。

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

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

示例 1:

image.png

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

示例 2:

image.png

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

示例 3:

image.png

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

提示:

  • 树中的结点数在[1,10^4]范围内。
  • -200 <= Node.val <= 200

深度优先搜索

题解思路: 寻找重复子树,对于树的搜索的话,可以使用深度深度优先搜索,这种方式可以让我们搜索完整颗树,但是对于重复的子树,我们要如何判断他们是重复的,想到的方式肯定是将树进行序列化成字符串,然后根据序列化的值去比较。使用一个Map来存储序列化的字符串与其对应的真正的树的根节点。题目解法详情见以下代码:

题解代码

class Solution {
    Map<String, TreeNode> map = new HashMap<>();
    Set<TreeNode> nodeSet = new HashSet<>();
    public List<TreeNode> findDuplicateSubtrees(TreeNode root) {
        dfs(root);
        return new ArrayList<>(nodeSet);
    }
    
    public String dfs(TreeNode node) {
        if (node == null) {
            return "";
        }
        StringBuilder sb = new StringBuilder();
        sb.append(node.val);
        sb.append("(");
        sb.append(dfs(node.left));
        sb.append(")(");
        sb.append(dfs(node.right));
        sb.append(")");

        String serial = sb.toString();
        if (map.containsKey(serial)) {
            nodeSet.add(map.get(serial));
        } else {
            map.put(serial, node);
        }

        return serial;
    }
}

结尾

我的"刷完LeetCode题库"系列文章的第 No.652 序号的题目,本次刷题之旅系列开始于 2022-06-12,因为LeetCode上部分是有锁题,我自己的目标是将先把所有不带锁的题目刷完。自己能够通过这次刷题之旅勉励自己,并且提升逻辑思维能力。这个系列的文章就是会见证我自己的一个成长过程!

思路虽然不是最优的,但是我会尽我所能!

为了让我自己的刷题之旅不中断,我特地建立了相关的仓库,来记录我自己的刷题之旅。 github.com/jackpan123/…