LeetCode Notes_#652_寻找重复的子树

LeetCode Notes_#652_寻找重复的子树

Contents

题目

给定一棵二叉树,返回所有重复的子树。对于同一类的重复子树,你只需要返回其中任意一棵的根结点即可。
两棵树重复是指它们具有相同的结构以及相同的结点值。

示例 1:

        1
       / \
      2   3
     /   / \
    4   2   4
       /
      4

下面是两个重复的子树:

      2
     /
    4

    4

因此,你需要以列表的形式返回上述重复子树的根结点。

思路分析

每个结点都对应着一棵子树,但是TreeNode类型是一个自定义类型,不可以直接比较两个TreeNode结构是否相同。
所以考虑将每个节点对应的子树进行序列化,然后将序列化结果作为存入HashMap是这个序列出现的次数。
那么就需要写一个序列化的函数serialize,这个过程其实就是跟树的DFS遍历是类似的。
需要注意的是:

  1. 序列化时必须要把null节点也算上,否则可能无法区分两个不同的子树。
  2. 不可以用中序遍历方式进行序列化,原因如下图。

解答

class Solution {
    List<TreeNode> result = new LinkedList<>();
    Map<String, Integer> map = new HashMap<>();
    public List<TreeNode> findDuplicateSubtrees(TreeNode root) {
        if(root == null) return result;
        serialize(root);
        return result; 
    }

    private String serialize(TreeNode root){
        if(root == null) return "null";
        String str = root.val + "," + serialize(root.left) + "," + serialize(root.right);
        map.put(str, map.getOrDefault(str, 0) + 1);
        if(map.get(str) == 2) result.add(root);
        return str;
    }
}

复杂度分析

N是树中节点的个数。
时间复杂度:O(N2)
空间复杂度:O(N2)

posted @ 2020-09-25 22:10  Howfar's  阅读(141)  评论(0)    收藏  举报