题目描述:

给定一棵二叉树,返回所有重复的子树。对于同一类的重复子树,你只需要返回其中任意一棵的根结点即可。

两棵树重复是指它们具有相同的结构以及相同的结点值。

示例 1:

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

下面是两个重复的子树:

      2/4

    4

因此,你需要以列表的形式返回上述重复子树的根结点。

思路分析;

  • 首先解决如何寻找重复的问题,要找重复的子树,如果重复了就保存一个树的根节点。这已经提示我们,遍历整棵树的所有节点,遍历的时候我们想办法得到以这个结点为根的子树的情况是什么样子的,显然用序列化二叉树,如何记录重复?这里我想到用哈希如果对应子树的序列出现次数超过1次那么就重复了,需要在结果中加入该子树的根结点。
  • 再就是如何遍历树?我们知道树分三种遍历方式:前序,中序和后序,这三种都是深度优先搜索DFS。当然还有层次遍历,不过这个属于广度优先搜索BFS理论上讲这4种遍历方式都是可行的,因为按照我们对问题的分析,我们仅仅只需要遍历整棵树的结点,但从遍历来讲,这几种方法都是可以达到目的的。
  • 如何序列化二叉树?我们知道要想序列和二叉树一一对应,只有前序序列和后序序列才可以。按照序列化的模板就OK啦,返回一个string类型的字符串,各个结点用逗号隔开,空指针用#表示。

代码实现:

class Solution {HashMap<String,Integer> memo=new HashMap<>();LinkedList<TreeNode> res=new LinkedList<>();public List<TreeNode> findDuplicateSubtrees(TreeNode root) {traverse(root);return res;}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);if(freq==1){res.add(root);}memo.put(subTree,freq+1);return subTree;}
}

LeetCode-652. 寻找重复的子树相关推荐

  1. LeetCode 652. 寻找重复的子树(DFS)

    1. 题目 给定一棵二叉树,返回所有重复的子树.对于同一类的重复子树,你只需要返回其中任意一棵的根结点即可. 两棵树重复是指它们具有相同的结构以及相同的结点值. 示例 1:1/ \2 3/ / \4 ...

  2. 9.9 力扣652. 寻找重复的子树

    652. 寻找重复的子树 - 力扣(LeetCode) 给定一棵二叉树 root,返回所有重复的子树. 对于同一类的重复子树,你只需要返回其中任意一棵的根结点即可. 如果两棵树具有相同的结构和相同的结 ...

  3. 652. 寻找重复的子树

    给定一棵二叉树,返回所有重复的子树.对于同一类的重复子树,你只需要返回其中任意一棵的根结点即可. 两棵树重复是指它们具有相同的结构以及相同的结点值. 示例 1: 1        / \       ...

  4. 数据结构与算法之LeetCode-652. 寻找重复的子树 - 力扣(1024程序员节)

    652. 寻找重复的子树 - 力扣(LeetCode) /*** Definition for a binary tree node.* function TreeNode(val, left, ri ...

  5. 算法---------寻找重复的子树(Java版本)

    题目描述: 给定一棵二叉树,返回所有重复的子树.对于同一类的重复子树,你只需要返回其中任意一棵的根结点即可.两棵树重复是指它们具有相同的结构以及相同的结点值.示例 1:1/ \2 3/ / \4 2 ...

  6. 寻找重复的子树 Find Duplicate Subtrees

    2018-07-29 17:42:29 问题描述: 问题求解: 本题是要求寻找一棵树中的重复子树,问题的难点在于如何在遍历的时候对之前遍历过的子树进行描述和保存. 这里就需要使用之前使用过的二叉树序列 ...

  7. LeetCode/LintCode 题解丨一周爆刷双指针:寻找重复的数

    描述 给出一个数组 nums 包含 n + 1 个整数,每个整数是从 1 到 n (包括边界). 保证至少存在一个重复的整数.假设只有一个重复的整数,找出这个重复的数. 不能修改数组(假设数组只能读) ...

  8. js实现kmp算法_「leetcode」459.重复的子字符串:KMP算法还能干这个!

    不瞒你说,重复子串问题,KMP很拿手 题目459.重复的子字符串 给定一个非空的字符串,判断它是否可以由它的一个子串重复多次构成.给定的字符串只含有小写英文字母,并且长度不超过10000. 示例 1: ...

  9. [贪心|字符串] leetcode 3 无重复字符的最长子串

    [贪心|字符串] leetcode 3 无重复字符的最长子串 1.题目 题目链接 给定一个字符串,请你找出其中不含有重复字符的最长子串的长度. 示例1: 输入: "abcabcbb" ...

最新文章

  1. ggcor包的安装与绘图示例
  2. 为什么设计模式在C++社区没有Java社区流行?
  3. Vue.js TypeScript 支持
  4. 8086汇编4位bcd码_51单片机用汇编语言实现BCD码转换
  5. 全国信息学奥林匹克联赛 ( NOIP2014) 复赛 模拟题 Day1 长乐一中
  6. RAC (双节点) + 单实例 DATAGUARD 安装遇到的问题处理
  7. python3类与对象汽车,Python3 类与对象
  8. 新手学java7编程_新手学Java 7编程:面向对象程序设计
  9. linux haokande shell,5 个 PowerShell 主题,让你的 Windows 终端更好看
  10. MyBatis返回结果不稳定
  11. 何川L3管理课_模块3_追进展(执行)
  12. 据说这里有一件数据库保密检查神器……
  13. Java 官方文档使用介绍
  14. 硬盘坏了怎么修复 教你如何修复硬盘坏道
  15. Java 在Excel中添加水印
  16. 群晖NAS设备MIB手册
  17. java 手机网站 cookie操作_Java中的cookie管理方案——完整易用的客户端cookie操作库...
  18. linux内核支持浮点吗,浅谈linux kernel对于浮点运算的支持
  19. 直面大数据撞击这个时代——畅享网成功举办大数据应用沙龙
  20. NginxProxyManager实现unraid反向代理

热门文章

  1. [No0000197]Windows用户都应该知道的运行命令
  2. Python学习笔记之头部文件
  3. [数据结构]A*寻路算法
  4. react-native ios打包和Android打包
  5. 隐藏的图片在浏览器中的请求
  6. 完美解决java.lang.OutOfMemoryError: bitmap size exceeds VM budget
  7. (转)Bibtex使用方法
  8. 关于tomcat5.5或6.0免安装版,点击startup.bat启动自动消失问题
  9. CCF201512-2 消除类游戏
  10. 不超过20位的小数正则_盘点贵州省的GDP增长:跃居全国20位,超过了两个难以超越的省份...