题目
给定一棵二叉树 root,返回所有重复的子树。
对于同一类的重复子树,你只需要返回其中任意一棵的根结点即可。
如果两棵树具有相同的结构和相同的结点值,则它们是重复的。
思路
把树进行序列化,比较的方式使用字符串比较更为方便,使用哈希map,key为字符串,出现次数作为value
序列化的方式为
"root->val root->left root->right"
将其作为哈希的key,插入树中,当遇到一个序列化后的树,也就是字符串时,计算其在哈希表中的个数,如果为2,说明是重复的子树,将此root节点插入ans中,个数超过2,说明已经插入ans了,不用进一步处理。
代码
class Solution {
public:
unordered_map<string, int> m;
vector<TreeNode*> ans;
string dfs(TreeNode* root) {
if(root == nullptr) return "";
string s = to_string(root->val) + " " + dfs(root->left) + " " + dfs(root->right);
m[s]++;
if(m[s] == 2) ans.push_back(root);
return s;
}
vector<TreeNode*> findDuplicateSubtrees(TreeNode* root) {
dfs(root);
return ans;
}
};