今日主要总结一下,652. 寻找重复的子树
题目:652. 寻找重复的子树
题目描述:
给你一棵二叉树的根节点 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发布的资源源码)
公众号主要记录编程和刷题时的总结复盘笔记和心得!并且分享读书、工作、生活中的一些思考感悟!