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日

相关文章

  • Sprint Boot @CachePut使用方法详解

    在Spring Boot中,@CachePut注解用于将方法的返回值存储到缓存中。使用@CachePut注解可以在方法执行后将结果缓存起来,以便下次使用相同的参数调用该方法时,可以直接从缓存中获取结果,而不必再次执行该方法。本文将详细介绍@CachePut注解的作用和使用方法,并提供两个示例说明。 @CachePut注解的作用 在Spring Boot中,@…

    Java 2023年5月5日
    00
  • struts2简介_动力节点Java学院整理

    Struts2简介 简介 Apache Struts 2 是一款基于 Java EE 的Web应用程序开发框架,它是Struts的后继者。Apache Struts 2 是一款基于MVC设计模式的框架。 特点 以下是Struts2的特点: Struts 2 是一个MVC框架,通过分离应用程序的模型、视图和控制器,为应用程序提供了松散耦合。 Struts 2跨…

    Java 2023年6月2日
    00
  • LibrarySystem图书管理系统开发(一)

    LibrarySystem图书管理系统开发(一) 概述 本文介绍了一种设计和开发图书管理系统的方法,该系统使用Python编程语言和Django框架开发。 需求 我们的图书管理系统需要具备以下功能: 添加/编辑/删除图书 添加/编辑/删除图书分类 借阅/归还图书 搜索图书 管理员登录 设计 数据库设计 我们需要至少两个相关的数据库表来存储数据: Book 和…

    Java 2023年5月30日
    00
  • Springboot详解整合SpringSecurity实现全过程

    下面是Spring Boot整合Spring Security的详细攻略,包含两个示例。 Spring Boot整合Spring Security实现全过程 Spring Security是一个功能强大的安全框架,可以帮助我们实现身份验证、授权、攻击防护等安全功能。在Spring Boot中,可以使用Spring Security提供的集成库来方便地使用Sp…

    Java 2023年5月15日
    00
  • Spring Security使用Lambda DSL配置流程详解

    Spring Security是一个非常强大和流行的框架,用于保护Web应用程序和REST API。在配置Spring Security时,我们可以使用Java配置或XML配置。然而,最近Spring Security又推出了一种新的配置方式,即使用Lambda DSL编程风格进行配置。本篇文章将详细讲解以Lambda DSL方式在Spring Securi…

    Java 2023年5月20日
    00
  • mybatis 查询方式与效率高低对比

    我来为您讲解一下“mybatis 查询方式与效率高低对比”的攻略。 一、Mybatis 查询方式 Mybatis 查询方式有以下几种: 简单查询方式:普通方式的查询,直接获取返回的结果; 嵌套查询方式:一次 SQL 根据外表的数据查询内表的多组数据; 延迟查询方式:一次 SQL 查询的结果对象是代理对象,只有当对象属性被真正访问的时候才会查询; 分布式查询方…

    Java 2023年5月20日
    00
  • Java StackTraceElement实例代码

    接下来我将为你详细讲解“Java StackTraceElement实例代码”的完整攻略。 什么是StackTraceElement 在Java程序中,当出现异常时,Java虚拟机会在控制台上打印错误堆栈信息,其中包含了程序执行时所调用方法的信息。Java的StackTraceElement类可以获取方法执行的堆栈跟踪信息,包括方法名、文件名、行数等。 语法…

    Java 2023年5月23日
    00
  • Java中Date,Calendar,Timestamp的区别以及相互转换与使用

    Java中Date,Calendar,Timestamp的区别以及相互转换与使用 在Java中,Date、Calendar和Timestamp是处理日期和时间的三个主要的类。本文将详细介绍它们的区别以及如何相互转换和使用。 Date类 Date类是Java中最早的日期和时间处理类。它表示从GMT(格林尼治标准时间)1970年1月1日00:00:00时间开始至…

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