参考:东哥带你刷二叉树(后序篇) | labuladong 的算法笔记
建议先过一遍:今天是二叉树~-CSDN博客,very重要!
然后再过一遍(理解怎么应用方法):保研机试之[三道二叉树习题,思路为主]-CSDN博客
然后再过一遍(了解后序思路) :保研机试之【构造二叉树】-CSDN博客
然后再过一遍(可以记录子树结构):保研机试之【二叉树序列化】-CSDN博客
来到今天的小剧场:652. 寻找重复的子树 - 力扣(LeetCode)
好神奇的一道题,我们应该把遍历到的子树记录下来,下次遍历到类似的子树结构时,将子树存入答案即可。所以进入一个结点时,我们需要考虑的是该子树结构是否被记录过,如果被记录过,则将该结点加入vector,如果没被记录过,则记录该子树的结构。那问题来了?如何记录子树结构,参考博客:保研机试之【二叉树序列化】-CSDN博客,也就是我们可以把二叉树结构转换为字符串,存到unordered_map中进行记录,为啥不放在unordered_set中呢,如果子树结构多次重复,我们只返回一次,所以我们需要记录当下的子树我们总共遇到的次数。
东哥总结如下:一旦你发现题目和子树有关,那大概率要给函数设置合理的定义和返回值,在后序位置写代码了。
代码如下:
/**
* 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:
vector<TreeNode*> ans;
unordered_map<string,int> hmap;
string find(TreeNode* root){
if(root==nullptr){return "#,";}
string l=find(root->left);
string r=find(root->right);
string res=to_string(root->val)+","+l+r;
if(hmap.find(res)==hmap.end()){
hmap[res]=1;
}
else{
if(hmap[res]==1){
ans.push_back(root);
hmap[res]++;
}
}
return res;
}
vector<TreeNode*> findDuplicateSubtrees(TreeNode* root) {
find(root);
return ans;
}
};
二叉树章节完结撒花~