给定一棵二叉树,返回所有重复的子树。对于同一类的重复子树,你只需要返回其中任意一棵的根结点即可。
两棵树重复是指它们具有相同的结构以及相同的结点值。
思路:用序列化字符串唯一表示一棵树,存下每一个节点的序列化字符串,序列化字符串相同的,就是同样结构。
string helper(TreeNode* root,map<string,vector<TreeNode*>>&mp){
if(!root)return "";
string s="("+helper(root->left,mp)+to_string(root->val)+helper(root->right,mp)+")";
mp[s].push_back(root);
return s;
}
vector<TreeNode*> findDuplicateSubtrees(TreeNode* root) {
vector<TreeNode*>res;
map<string,vector<TreeNode*>>mp;
helper(root,mp);
for(auto it:mp){
if(it.second.size()>1)
res.push_back(it.second[0]);
}
return res;
}