652_寻找重复子树_mid

76 阅读1分钟

题目

给定一棵二叉树 root,返回所有重复的子树。

对于同一类的重复子树,你只需要返回其中任意一棵的根结点即可。

如果两棵树具有相同的结构和相同的结点值,则它们是重复的。

652_寻找重复子树1.jpg

思路

把树进行序列化,比较的方式使用字符串比较更为方便,使用哈希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;
    }
};