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


    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
  • 相关阅读:
    python操作.xlsx文件
    SublimeText4 安装
    指针类型的意义
    啥,你居然不知道MySQL主从复制,那还不赶紧来补一补
    重生之我是一名程序员 34
    大一学生Web课程设计 美食主题网页制作(HTML+CSS+JavaScript)-咖啡 6页
    stm32-arm固件开发
    [moeCTF 2023] REV
    【产品经理】APP备案(阿里云)
    HTML VUE
  • 原文地址:https://blog.csdn.net/qq_41358366/article/details/126701849