LeetCode-652. 寻找重复的子树

举报
小小谢先生 发表于 2022/04/16 00:15:35 2022/04/16
【摘要】 题目描述: 给定一棵二叉树,返回所有重复的子树。对于同一类的重复子树,你只需要返回其中任意一棵的根结点即可。 两棵树重复是指它们具有相同的结构以及相同的结点值。 示例 1: 1 / \ 2 3 / / \ 4 2 4 / 4 下面是...

题目描述:

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

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

示例 1:

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

下面是两个重复的子树:

      2
     /
    4

    4

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

思路分析;

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

代码实现:


  
  1. class Solution {
  2. HashMap<String,Integer> memo=new HashMap<>();
  3. LinkedList<TreeNode> res=new LinkedList<>();
  4. public List<TreeNode> findDuplicateSubtrees(TreeNode root) {
  5. traverse(root);
  6. return res;
  7. }
  8. String traverse(TreeNode root){
  9. if(root==null){
  10. return "#";
  11. }
  12. String left=traverse(root.left);
  13. String right=traverse(root.right);
  14. String subTree=left+","+right+","+root.val;
  15. int freq=memo.getOrDefault(subTree,0);
  16. if(freq==1){
  17. res.add(root);
  18. }
  19. memo.put(subTree,freq+1);
  20. return subTree;
  21. }
  22. }

 

文章来源: blog.csdn.net,作者:小小谢先生,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/xiewenrui1996/article/details/113980098

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。