问题描述:
- 给定一棵二叉树
root
,返回所有重复的子树。
- 对于同一类的重复子树,只需要返回其中任意一棵的根结点即可。
- 如果两棵树具有相同的结构和相同的结点值,则它们是重复的。
核心思路:
- 该题考察了如何将子树转换成序列。
- 保存成字符串即可,在当前递归中,将构造出的字符串存入哈希表中计数,假若存入哈希表之前频数为
1
,说明以当前节点为根的子树已经出现过一次,则将当前节点存入结果数组即可。
代码实现:
class Solution
{
private:
vector<TreeNode*> ans;
unordered_map<string, int> cnt;
string dfs(TreeNode* root)
{
if(!root) return "#";
string ret;
ret += to_string(root->val) += " "s += dfs(root->left) += " "s += dfs(root->right);
if(cnt[ret]++ == 1)
ans.emplace_back(root);
return ret;
}
public:
vector<TreeNode*> findDuplicateSubtrees(TreeNode* root)
{
dfs(root);
return ans;
}
};