給定一棵二叉樹,返回所有重複的子樹。對於同一類的重複子樹,你只需要返回其中任意一棵的根結點即可。
兩棵樹重複是指它們具有相同的結構以及相同的結點值。
思路
首先是進行序列化,然後序列化的過程中,進行樹的深度優先搜索,在樹的搜索過程中,進行一個結果的統計。
畢竟樹的深度優先訪問的時間負雜度是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;
}
};
總結
樹的遍歷過程+操作就可以完成很多任務了。