【leetcode】652. 尋找重複的子樹

給定一棵二叉樹,返回所有重複的子樹。對於同一類的重複子樹,你只需要返回其中任意一棵的根結點即可。

兩棵樹重複是指它們具有相同的結構以及相同的結點值。

思路

首先是進行序列化,然後序列化的過程中,進行樹的深度優先搜索,在樹的搜索過程中,進行一個結果的統計。
畢竟樹的深度優先訪問的時間負雜度是O(n)的。

代碼

class Solution {
public:
    vector<TreeNode*> findDuplicateSubtrees(TreeNode* root) {
        if (root == nullptr) return {};
        vector<TreeNode*> res;
        map<string, int> m;
        dfs(root, res, m);
        return res;
    }
    string dfs(TreeNode* root, vector<TreeNode*>&res, map<string,int>&m) {
        if (root == nullptr) return "";
        string ks = to_string(root->val) + "," + dfs(root->left,res,m) + "," + dfs(root->right, res, m); 
        if (++m[ks] == 2) {
            res.push_back(root);
        }
        return ks;
    }
};

總結

樹的遍歷過程+操作就可以完成很多任務了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章