Java C++ 算法题解leetcode652寻找重复子树

Java C++ 算法题解leetcode652寻找重复子树

题目描述

给定一棵二叉树,返回所有重复子树的根节点,这些子树重复出现在原始的二叉树中。重复的子树意味着在同一位置具有相同的结构以及相同的节点值。

思路分析

  1. 我们需要类型为 Map 的一个 map,该 map 用于存储所有子树的出现次数。

  2. 我们对二叉树做一次后序遍历,得到一个标识了每一个子树的字符串。对每一个子树的字符串,将该字符串存入 map 中,如果该字符串在 map 中已经存在,则其对应的值加 1。

  3. 因为一个节点最多只能出现在一个子树中,所以只有当该节点的出现次数为 2 时,才需要将该子树的根节点加入到结果列表中。

代码实现

Java

class Solution {
    List<TreeNode> list = new ArrayList<>();
    Map<String, Integer> map = new HashMap<>();

    public List<TreeNode> findDuplicateSubtrees(TreeNode root) {
        postOrder(root);
        return list;
    }

    public String postOrder(TreeNode node){
        if (node == null) {
            return "#";
        }
        String subTree = postOrder(node.left) + "," + postOrder(node.right) + "," + node.val;
        int count = map.getOrDefault(subTree, 0);
        if (count == 1) {
            list.add(node);
        }
        map.put(subTree, count + 1);
        return subTree;
    }
}

C++

class Solution {
private:
    unordered_map<string, int> map;
    vector<TreeNode*> res;
public:
    vector<TreeNode*> findDuplicateSubtrees(TreeNode* root) {
        postorder(root);
        return res;
    }

    string postorder(TreeNode* node) {
        if (!node) {
            return "#";
        }
        string left = postorder(node->left);
        string right = postorder(node->right);
        string subTree = left + "," + right + "," + to_string(node->val);
        if (map[subTree] == 1) {
            res.push_back(node);
        }
        map[subTree]++;
        return subTree;
    }
};

示例说明

示例 1

输入

    1
   / \
  2   3
 /   / \
4   2   4
   /
  4

输出

   2
  / \
 4   4

说明

我们给出了两个相同的子树,分别是:

4

2
/ \
4   4

示例 2

输入

    1
   / \
  2   3
 /   / \
4   2   4
   /
  4
 /
5

输出

4

说明

我们给出了两个相同的子树,分别是:

4

5

由于题目要求输出相同的子树的根节点,我们输出了根节点为 4 的子树。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java C++ 算法题解leetcode652寻找重复子树 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • Java实现获得MySQL数据库中所有表的记录总数可行方法

    下面就来详细讲解“Java实现获得MySQL数据库中所有表的记录总数可行方法”的完整攻略。 1. 方案介绍 在 Java 中,我们可以使用 JDBC(Java Database Connectivity)API 来访问关系型数据库,其中包括 MySQL 数据库。我们可以通过执行 SQL 语句获取 MySQL 数据库中所有表的记录总数,主要有以下两种方法: 1…

    Java 2023年5月20日
    00
  • Java数据类型转换的示例详解

    Java数据类型转换的示例详解 什么是数据类型转换? 在Java中,我们定义变量时需要指定变量的数据类型。不同的数据类型可以存储不同范围内的数值,例如byte类型可以存储从-128到127的整数,而int类型可以存储更大的整数。在程序中,有时需要将一个数据类型的值转换为另一个数据类型的值,这就叫做数据类型转换。 转换类型 Java中数据类型转换分为隐式类型转…

    Java 2023年5月20日
    00
  • Java Apache Commons报错“IOException”的原因与解决方法

    当使用Java的Apache Commons类库时,可能会遇到“IOException”错误。这个错误通常由以下原因之一起: I/O操作失败:如果I/O操作失败,则可能会出现此错误。在这种情况下,需要检查I/O操作以决此问题。 文件或目录不存在:如果文件或目录不存在,则可能会出现此错误。在这种情况下,需要确保文件或目录存在。 以下是两个实例: 例1 如果I/…

    Java 2023年5月5日
    00
  • HTML相关知识点总结

    HTML相关知识点总结 什么是HTML? HTML(Hypertext Markup Language)是一种用于创建Web页面的标准标记语言。它使用标记标识文本、图片、链接和其他内容,告诉Web浏览器如何组织和显示页面。 HTML基础结构 HTML文档通常包括以下结构: <!DOCTYPE html> <html> <head…

    Java 2023年5月26日
    00
  • 详解ArrayBlockQueue源码解析

    详解ArrayBlockingQueue源码解析 ArrayBlockingQueue是Java集合框架中的阻塞队列,该队列的容量固定不变,而且是有界的。它是线程安全的,任何时刻只有一个线程能够访问队列,当队列已满时插入元素的线程会被阻塞,当队列为空时,获取元素的线程会被阻塞。 基本特性 固定容量大小 先进先出 线程安全 阻塞队列 主要方法 ArrayBlo…

    Java 2023年5月26日
    00
  • java的Hibernate框架报错“TransactionRequiredException”的原因和解决方法

    当使用Java的Hibernate框架时,可能会遇到“TransactionRequiredException”错误。这个错误通常是由于以下原因之一引起的: 事务管理器配置错误:如果您的事务管理器配置错误,则可能会出现此错误。在这种情况下,需要检查您的事务管理器配置以解决此问题。 事务注解缺失:如果您的事务注解缺失,则可能会出现此错误。在这种情况下,需要添加…

    Java 2023年5月4日
    00
  • Jdbc连Sybase数据库的几种方法

    JDBC是Java数据库连接的标准接口,在Java程序中可通过JDBC来访问多种类型的数据库。本文将针对Sybase数据库,介绍几种连接Sybase数据库的方法,以及代码示例。 1. 准备工作 在使用JDBC连接Sybase数据库之前,需要先进行准备工作,包括安装Sybase数据库、Sybase驱动程序。 1.1 安装Sybase数据库 Sybase数据库是…

    Java 2023年6月16日
    00
  • SpringBoot项目开发常用技术整合

    Spring Boot项目开发常用技术整合 Spring Boot是一个基于Spring框架的快速开发应用程序的工具。它提供了一种快速、便捷的方式来创建基于Spring的应用程序,同时也提供了一些默认的和约定,使得开发人员可以更加专注于业务逻辑的实现。本文将详细讲解如何使用Spring Boot整合常用技术,并提供两个示例。 1. 整合MyBatis MyB…

    Java 2023年5月15日
    00
合作推广
合作推广
分享本页
返回顶部