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)

  • 相关阅读:
    LeetCode Subsets II
    LeetCode Rotate Image
    LeetCode Palidrome Number
    LeetCode Generate Parentheses
    LeetCode Maximum Subarray
    LeetCode Set Matrix Zeroes
    LeetCode Remove Nth Node From End of List
    Linux Loop设备 使用
    Linux 文件系统大小调整
    LeetCode N-Queens II
  • 原文地址:https://www.cnblogs.com/Howfars/p/13732872.html
Copyright © 2011-2022 走看看