题目:
给定一棵二叉树,返回所有重复的子树。对于同一类的重复子树,你只需要返回其中任意一棵的根结点即可。
两棵树重复是指它们具有相同的结构以及相同的结点值。
示例 1:
1
/ \
2 3
/ / \
4 2 4
/
4
下面是两个重复的子树:
2
/
4
和
4
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/find-duplicate-subtrees
分析:
对于寻找重复子树,我们主要是使用map去存下当前子树(序列化)为键的个数,主要是如何序列化,解序列化。
code:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution
{
// 记录当前序列化的个数
map<string, int> mp;
// 用来存节点的序列
map<TreeNode*, string> visited;
// 用来记录当前序列化的根节点
map<string, TreeNode*> ans;
void dfs(TreeNode *root)
{
string tmp = to_string(root->val);
if (!root->left && !root->right)
{
mp[tmp]++;
ans[tmp] = root;
visited[root] = tmp;
}
else
{
if (root->left)
dfs(root->left);
if (root->right)
dfs(root->right);
string vl = tmp + visited[root->left] + visited[root->right];
visited[root] = vl;
ans[vl] = root;
mp[vl]++;
}
}
public:
vector<TreeNode *> findDuplicateSubtrees(TreeNode *root)
{
vector<TreeNode *> v;
if(!root)
return v;
visited[NULL] = "#";
dfs(root);
map<string, int>::iterator it = mp.begin();
for (it; it != mp.end(); it++)
if (it->second >= 2)
{
v.push_back(ans[it->first]);
}
return v;
}
};