zoukankan      html  css  js  c++  java
  • 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)

  • 相关阅读:
    SSL 1010——方格取数
    SSL 1558——科技庄园
    SSL 2295——暗黑破坏神
    SSL 2294——打包
    SSL 2293——暗黑游戏
    SSL 2305——竞赛总分
    SSL 1072——砝码称重
    SSL 2291——分组背包
    SSL 2290——潜水员
    SSL 2301——混合背包
  • 原文地址:https://www.cnblogs.com/Howfars/p/13732872.html
Copyright © 2011-2022 走看看