前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >LeetCode:寻找重复的子树_652

LeetCode:寻找重复的子树_652

作者头像
Yuyy
发布2022-06-28 20:39:17
发布2022-06-28 20:39:17
22000
代码可运行
举报
运行总次数:0
代码可运行

思路

问题一:如果遍历比较

  • 遍历所有节点,然后两两比较。时间复杂度O(n)。一看性能就不行。
  • 利用set来判断是否重复。不过有重复多次的情况,但只需返回一个重复节点,所以还需要记录count,使用map即可。

问题二:如何判断两个节点结构相同

  • 通过递归,同时遍历两个节点。因为一个节点需要和多次比较,所以同一个节点需要遍历多次,性能差。
  • 序列化二叉树。将二叉树遍历,转成字符串。不过需要注意
    1. 中序无法反序列化
    2. 中序的序列化是不能确定二叉树的,前序和后序就行。具体原因还没想清楚,正在LeetCode请教大佬。

题目

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

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

示例 1:

代码语言:javascript
代码运行次数:0
复制
        1
       / \
      2   3
     /   / \
    4   2   4
       /
      4

下面是两个重复的子树:

代码语言:javascript
代码运行次数:0
复制
      2
     /
    4

代码语言:javascript
代码运行次数:0
复制
    4

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

Related Topics

  • 深度优先搜索
  • 广度优先搜索
  • 二叉树
  • 👍 324
  • 👎 0

代码

代码语言:javascript
代码运行次数:0
复制
class Solution {
        private List<TreeNode> res = new ArrayList<>();
        private Map<String, Integer> memo = new HashMap<>();

        public List<TreeNode> findDuplicateSubtrees(TreeNode root) {
            serializeNode(root);
            return res;
        }

        private String serializeNode(TreeNode root) {
            if (root == null) {
                return "#";
            }

            String left = serializeNode(root.left);
            String right = serializeNode(root.right);
            // 序列化二叉树
            String curr = left + "," + right + "," + root.val;

            Integer count = memo.getOrDefault(curr, 0);
            if (count == 1) {
                res.add(root);
            }
            memo.put(curr, count + 1);
            return curr;
        }
    }

Post Views: 158

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-10-29 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 思路
    • 问题一:如果遍历比较
    • 问题二:如何判断两个节点结构相同
  • 题目
  • 代码
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档