力扣652. 寻找重复的子树

Problem: 652. 寻找重复的子树

文章目录

题目描述

思路

1.利用二叉树的后序遍历 将原始的二叉树序列化 (之所以利用后序遍历 是因为其在归的过程中是会携带左右子树的节点信息,而这些节点信息正是该解法要利用的东西);

2.在一个哈希表中存储每一个序列化后子树和其出现的次数(初始时设为出现0次,每当有一次重复就将其次数加一);

3.将哈希表中出现次数大于等于1的子树的节点添加到一个结果集合中

复杂度

时间复杂度:

O ( n ) O(n) O(n);其中 n n n二叉树中节点的个数

空间复杂度:

O ( n ) O(n) O(n)

Code

java 复制代码
/**
 * 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 {
    // Record all subtrees and the number of occurrences
    Map<String, Integer> memo = new HashMap<>();
    // Record duplicate child root nodes
    List<TreeNode> res = new LinkedList<>();

    /**
     * Find Duplicate Subtrees
     *
     * @param root The root of binary tree
     * @return List<TreeNode>
     */
    public List<TreeNode> findDuplicateSubtrees(TreeNode root) {
        traverse(root);
        return res;
    }

    /**
     * Find Duplicate Subtrees(Implementation function)
     *
     * @param root The root of binary tree
     * @return String
     */
    private String traverse(TreeNode root) {
        if (root == null) {
            return "#";
        }
        String left = traverse(root.left);
        String right = traverse(root.right);

        String subTree = left + "," + right + "," + root.val;

        int freq = memo.getOrDefault(subTree, 0);
        // Multiple repetitions will only be added to the result set once
        if (freq == 1) {
            res.add(root);
        }
        // Add one to the number of
        // occurrences corresponding to the subtree
        memo.put(subTree, freq + 1);
        return subTree;
    }
}
相关推荐
Asize3 分钟前
543. 二叉树的直径
算法
lemon_sjdk8 分钟前
ObjectProperty
java·开发语言·算法
Zentceh33 分钟前
AI-ISP在夜视机芯中的应用:从传统ISP到PixelClean全彩夜视的进化
人工智能·科技·算法·计算机视觉·车载系统·视频·智能硬件
xier_ran1 小时前
【infra之路】AWQ 详解:激活感知权重保护,让 W4A16 量化精度超越 GPTQ
线性代数·算法·机器学习·量化·infra
亦皓ai1 小时前
AI时代后端工程(二):AI把代码写得越来越快,我却越来越不敢让它直接开工了
人工智能·算法·机器学习·搜索引擎·transformer
玖玥拾3 小时前
LeetCode 392 判断子序列
笔记·算法·leetcode
学习星球3 小时前
DSA 面试精讲 · Trie 前缀树:一文掌握字符串前缀匹配
面试·职场和发展
重生之后端学习4 小时前
239. 滑动窗口最大值[困难]✅
java·数据结构·算法·leetcode·职场和发展
fpcc4 小时前
算法和数据结构—动态规划法
数据结构·算法·动态规划
笨笨饿7 小时前
#111_关于FreeRTOS面试的一些题目
linux·ubuntu·面试·职场和发展·centos·rtos