题目描述:
给你一棵二叉树的根节点 root
,返回所有 重复的子树 。
对于同一类的重复子树,你只需要返回其中任意 一棵 的根结点即可。
如果两棵树具有 相同的结构 和 相同的结点值 ,则认为二者是 重复 的。
题解:
将所有二叉树子树序列化成字符串然后利用哈希表统计出现过的二叉树序列如果出现重复的那么就将该节点插入答案序列。(二叉树序列化其实就是按照某种顺序输出二叉树节点的值)
需要注意的细节是,节点的取值是多位数,因此不能直接使用加法连接,而是要在中间加上括号来识别序列。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
vector<TreeNode*> findDuplicateSubtrees(TreeNode* root) {
dfs(root);
return {repeat.begin(),repeat.end()};
}
string dfs(TreeNode * node){
if(!node){
return "";
}
string temp;
temp=to_string(node->val)+"("+dfs(node->left)+")("+dfs(node->right)+")";
if(auto it=seen.find(temp);it!=seen.end()){
repeat.insert(it->second);
}else{
seen[temp]=node;
}
return temp;
}
private:
unordered_map<string,TreeNode*> seen;
unordered_set<TreeNode*> repeat;
};