652. 寻找重复的子树

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

两棵树重复是指它们具有相同的结构以及相同的结点值。

示例 1:

1
/ \
2 3
/ / \
4 2 4
/
4
下面是两个重复的子树:

2
/
4

4
因此,你需要以列表的形式返回上述重复子树的根结点。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/find-duplicate-subtrees
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

 

/**
 * 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:
    unordered_map<string,int>hash;
    vector<TreeNode*>res;
    string dfs(TreeNode* node){
        if(!node)return "NULL";
        string left=dfs(node->left);
        string right=dfs(node->right);
        string s=to_string(node->val)+','+left+','+right;
        if(++hash[s]==2)res.emplace_back(node);
        return s;
    }
    vector<TreeNode*> findDuplicateSubtrees(TreeNode* root) {
        dfs(root);
        return res;
    }
};

 

posted @ 2020-11-19 20:15  XXXSANS  阅读(159)  评论(0编辑  收藏  举报