• 将二叉树的子树映射成一个数,用于判断子树相同


    leetcode652. 寻找重复的子树

    给定一棵二叉树 root,返回所有重复的子树。 对于同一类的重复子树,你只需要返回其中任意一棵的根结点即可。如果两棵树具有相同的结构和相同的结点值,则它们是重复的。
    提示:

    • 树中的结点数在 [ 1 , 1 0 4 ] [1,10^4] [1,104]范围内。
    • − 200 ≤ N o d e . v a l ≤ 200 -200 \leq Node.val \leq 200 200Node.val200

    思路

    1. 可以将子树映射为一个包含全部节点值的字符串,并将该字符串存于哈希表中,当出现超过1次时,说明存在相同子树。但是涉及到所有节点值得字符串拼接,总的时间复杂度达到 O ( n 2 ) O(n^2) O(n2)
    2. 可以将一个子树映射成一个 i d id id,判断两个子树是否相同只需要判断 i d id id是否相同即可。一个子树可表示为三元组 { n o d e . v a l , l e f t . i d , r i g h t . i d } \{node.val,left.id,right.id\} {node.val,left.id,right.id}。当两个子树的三元组完全相同,那么说明这两个子树相同,可映射为同一个 i d id id。(子树 ⇒ \Rightarrow 三元组 ⇒ \Rightarrow i d id id)。

    代码

    解法1

    /**
     * Definition for a binary tree node.
     * public class TreeNode {
     *     int val;
     *     TreeNode left;
     *     TreeNode right;
     *     TreeNode() {}
     *     TreeNode(int val) { this.val = val; }
     *     TreeNode(int val, TreeNode left, TreeNode right) {
     *         this.val = val;
     *         this.left = left;
     *         this.right = right;
     *     }
     * }
     */
    class Solution {
    
        List<TreeNode> res = new ArrayList<>();
        Map<String,Integer> map = new HashMap<>();
    
        public List<TreeNode> findDuplicateSubtrees(TreeNode root) {
            dfs(root);
            return res;
        }
    
        public String dfs(TreeNode root) {
            if(root == null) {
                return "null";
            }
            String s = String.valueOf(root.val) + "," + dfs(root.left) + "," + dfs(root.right);
            map.put(s, map.getOrDefault(s, 0) + 1);
            if(map.get(s) == 2) {
                res.add(root);
            }
            return s;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37

    解法2

    /**
     * Definition for a binary tree node.
     * public class TreeNode {
     *     int val;
     *     TreeNode left;
     *     TreeNode right;
     *     TreeNode() {}
     *     TreeNode(int val) { this.val = val; }
     *     TreeNode(int val, TreeNode left, TreeNode right) {
     *         this.val = val;
     *         this.left = left;
     *         this.right = right;
     *     }
     * }
     */
    class Solution {
    
        Map<String,Integer> map = new HashMap<>();
        Map<Integer,Integer> cnt = new HashMap<>();
        List<TreeNode> res = new ArrayList<>();
        int count = 0;
    
        public List<TreeNode> findDuplicateSubtrees(TreeNode root) {
            dfs(root);
            return res;
        }   
    
        public int dfs(TreeNode root) {
            if(root == null) {
                return 0;
            }
            int l = dfs(root.left), r = dfs(root.right);
            String s = String.valueOf(root.val) + " " + String.valueOf(l) + " " + String.valueOf(r);
            if(map.get(s) == null) {
                map.put(s, ++count);
            }
            int idx = map.get(s);
            cnt.put(idx, cnt.getOrDefault(idx, 0) + 1);
            if(cnt.get(idx) == 2) {
                res.add(root);
            }
            return idx;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
  • 相关阅读:
    【Java项目】销售评价系统
    macOS三种软件安装目录以及环境变量优先级
    直播课堂系统06-搭建项目前端环境
    如何完美解决前端数字计算精度丢失与数字格式化问题?
    猿如意开发工具|JetBrains GoLand
    如何成为小型咖啡店的优秀老板?需具备这6个特质
    4.6 static修饰符
    js ---- 高级
    华为H12-831题库
    Android触摸屏TP crah 日志 addr2line
  • 原文地址:https://blog.csdn.net/qq_41358366/article/details/126701849