c_cpp 652.查找重复的子树 - 2018.9.19

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c_cpp 652.查找重复的子树 - 2018.9.19相关的知识,希望对你有一定的参考价值。

class Solution {
public:
    // 构建标志字段
    string generateSubTreeString(TreeNode *root, map<TreeNode*, string>& cacheMap) {
        string re = "";
        if (root == NULL) return re;
        if (cacheMap[root].size() > 0) 
            return cacheMap[root];
        re += to_string(root->val);
        if (root->left == NULL 
           && root->right == NULL) {
            return re;
        }
        re += "(";
        if (root->left != NULL) {
            re += generateSubTreeString(root->left, cacheMap);
        }
        if (root->right != NULL) {
            re += ",";
            re += generateSubTreeString(root->right, cacheMap);
        }
        re += ")";
        cacheMap[root] = re;
        return re;
    }
    // 获取所有节点
    void getAllNode(TreeNode* root, stack<TreeNode *>& tS) {
        if (root == NULL) return;
        tS.push(root);
        getAllNode(root->left, tS);
        getAllNode(root->right, tS);
    }
    vector<TreeNode*> findDuplicateSubtrees(TreeNode* root) {
        vector<TreeNode *> re;
        map<TreeNode*, string> cacheMap;
        map<string, int> sM;
        stack<TreeNode *> tS;
        getAllNode(root, tS);
        TreeNode *curNode;
        while (!tS.empty()) {
            curNode = tS.top();
            tS.pop();
            string tmpS = generateSubTreeString(curNode, cacheMap);
            if (tmpS.size() > 0) {
                if (sM[tmpS] == 1) {
                    re.push_back(curNode);
                }
                sM[tmpS] += 1;
            }
        }
        return re;
    }
};

以上是关于c_cpp 652.查找重复的子树 - 2018.9.19的主要内容,如果未能解决你的问题,请参考以下文章

Leetcode 652.寻找重复的子树

每日一题652. 寻找重复的子树

LeetCode 652. 寻找重复的子树

[Leetcode]652.Find Duplicate Subtrees

LeetCode 1475. 商品折扣后的最终价格 / 687. 最长同值路径 / 652. 寻找重复的子树

LeetCode 1475. 商品折扣后的最终价格 / 687. 最长同值路径 / 652. 寻找重复的子树