LeetCode刷题复盘笔记—652. 寻找重复的子树

今日主要总结一下,652. 寻找重复的子树

题目:652. 寻找重复的子树

Leetcode题目地址

题目描述:

给你一棵二叉树的根节点 root ,返回所有 重复的子树 。

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

如果两棵树具有 相同的结构 和 相同的结点值 ,则认为二者是 重复 的。

示例 1:
在这里插入图片描述
输入:root = [1,2,3,4,null,2,4,null,null,4]
输出:[[2,4],[4]]
示例 2:

在这里插入图片描述

输入:root = [2,1,1]
输出:[[1]]
示例 3:

在这里插入图片描述

输入:root = [2,2,2,3,null,3,null]
输出:[[2,3],[3]]

提示:

树中的结点数在 [1, 5000] 范围内。
-200 <= Node.val <= 200

本题重难点

这道题的重难点主要是要想清楚通过什么来判断两个子树是否重复!

本题可以借助二叉树序列化的方法——把二叉树转化成字符串,每一个子树对应一个字符串,只要判断字符串是否重复,就可以知道子树是否重复,这里可以借助哈希表来判断是否重复,而且这一道题还要求输出结果不能重复:“对于同一类的重复子树,你只需要返回其中任意 一棵 的根结点即可。”

所以最终考虑使用unordered_map<string, int>,记录每个字符串重复次数, 只有当键值对的值为1(当前只重复1次时)时才加入到最终的输出结果中!

一、正确解法

C++代码

class Solution {
public:
    vector<TreeNode*> res;
    unordered_map<string, int> hash;
    string traversal(TreeNode* root){
        if(!root) return "#";
        string left = traversal(root->left);
        string right = traversal(root->right);
        string subTree = left + "," + right + "," + to_string(root->val);
        if(hash[subTree] == 1){
            res.push_back(root);
        }
        hash[subTree]++;
        return subTree;
    }
    vector<TreeNode*> findDuplicateSubtrees(TreeNode* root) {
        traversal(root);
        return res;
    }
};

总结

这道题的重难点主要是要想清楚通过什么来判断两个子树是否重复!

本题可以借助二叉树序列化的方法——把二叉树转化成字符串,每一个子树对应一个字符串,只要判断字符串是否重复,就可以知道子树是否重复,这里可以借助哈希表来判断是否重复,而且这一道题还要求输出结果不能重复:“对于同一类的重复子树,你只需要返回其中任意 一棵 的根结点即可。”

所以最终考虑使用unordered_map<string, int>,记录每个字符串重复次数, 只有当键值对的值为1(当前只重复1次时)时才加入到最终的输出结果中!


欢迎大家扫码关注本人公众号:编程复盘与思考随笔

(关注后可以免费获得本人在csdn发布的资源源码)

公众号主要记录编程和刷题时的总结复盘笔记和心得!并且分享读书、工作、生活中的一些思考感悟!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Al资料站与复盘笔记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值