题目:
解答:
使用深度优先搜索,其中递归函数返回当前子树的序列化结果。把每个节点开始的子树序列化结果保存在 mapmap 中,然后判断是否存在重复的子树。
1 /** 2 * Definition for a binary tree node. 3 * struct TreeNode { 4 * int val; 5 * TreeNode *left; 6 * TreeNode *right; 7 * TreeNode(int x) : val(x), left(NULL), right(NULL) {} 8 * }; 9 */ 10 class Solution { 11 public: 12 vector<TreeNode*> findDuplicateSubtrees(TreeNode* root) 13 { 14 vector<TreeNode*> res; 15 unordered_map<string, int> mp; 16 17 dfs(root, res, mp); 18 19 return res; 20 } 21 22 string dfs(TreeNode* root, vector<TreeNode*>& res, unordered_map<string, int>& mp) 23 { 24 if(root==0) 25 { 26 return ""; 27 } 28 //二叉树先序序列化 29 string str = to_string(root->val) + "," + dfs(root->left, res, mp) + "," + dfs(root->right, res, mp); 30 31 if(mp[str] == 1) 32 { 33 res.push_back(root); 34 } 35 36 mp[str]++; 37 return str; 38 } 39 };