保研机试之【二叉树后序】--1道题

参考:东哥带你刷二叉树(后序篇) | 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;
    }
};

二叉树章节完结撒花~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值