首页 > 其他分享 >leetcode 652 寻找重复的子树

leetcode 652 寻找重复的子树

时间:2022-09-18 20:45:45浏览次数:80  
标签:子树 TreeNode 重复 nullptr right 652 root leetcode left

652. 寻找重复的子树
难度
中等

630

 

 

给你一棵二叉树的根节点 root ,返回所有 重复的子树 。

对于同一类的重复子树,你只需要返回其中任意 一棵 的根结点即可。

如果两棵树具有 相同的结构 和 相同的结点值 ,则认为二者是 重复 的。

 

示例 1:

 

 

 

输入:root = [1,2,3,4,null,2,4,null,null,4]
输出:[[2,4],[4]]
示例 2:

 

 

 

输入:root = [2,1,1]
输出:[[1]]
示例 3:

 

 

 

输入:root = [2,2,2,3,null,3,null]
输出:[[2,3],[3]]
 

提示:

树中的结点数在 [1, 5000] 范围内。
-200 <= Node.val <= 200

 

思路:

根据题意我们需要判断两棵树是否具有相同的结构和节点值?

此时我们思考如何表达数的结构和节点值

我们借助二叉树的序列化,从底部向上序列化二叉树,每序列化一棵子树,借助哈希表

判断是否和已经有的子树重复了,如果没有重复,将其加入到哈希表中,第一次重复,那么我们将该子树序列化的字符串对应的指针改为空,表明存在相同的结构和节点值的该子树,后续如果重复只需要判断该序列化的字符串在哈希表中对应的指针是不是空,如果不是空,那么代表该重复子树对应的字符串已经被加入到了输出结果中,避免同一类型的重复被多次输出.

 

AC代码如下

unordered_map 不排序哈希表

find函数查找是否存在对应键的键值对

/**
 * 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:
    unordered_map<string,TreeNode*> recur;
    vector<TreeNode*> res;
    vector<TreeNode*> findDuplicateSubtrees(TreeNode* root) {
          //返回所有重复的子树
          //两棵树具有相同的结构和节点值 如何表达树的结构和节点值
          //字符串? 
          //如何判断两棵树相同 到某个节点所遍历到的
          dfs(root);
          return res;
    }

    string dfs(TreeNode* root){
        if(root==nullptr) return "null";
        string s=dfs(root->left)+"l"+to_string(root->val)+dfs(root->right)+"r";
        if(recur.find(s)==recur.end())recur[s]=root;//没有重复的
        else {
           if(recur[s]!=nullptr) res.push_back(root);
           recur[s]=nullptr;
        }
        return s;
    }
};

 

标签:子树,TreeNode,重复,nullptr,right,652,root,leetcode,left
From: https://www.cnblogs.com/TrenmenHu/p/16705695.html

相关文章

  • leetcode 127 -- 哈希表
    题目描述217手写哈希表classSolution{public:#defineDEFAULT_LEN16#defineDEFAULT_FACTOR0.75fconstfloatfactor=DEFAULT_FACTOR;typed......
  • leetcode1047-删除字符串中的所有相邻重复项
    1047.删除字符串中的所有相邻重复项 方法一:stack 这种做法是纯纯的小丑做法,因为string类型本身就可以实现栈。这样的做法结束之后还要出栈倒序放到字符串里,时间开销......
  • leetcode 2414. 最长的字母序连续子字符串的长度
    leetcode2414.最长的字母序连续子字符串的长度题目描述字母序连续字符串是由字母表中连续字母组成的字符串。换句话说,字符串"abcdefghijklmnopqrstuvwxyz"的任意子......
  • leetcode 6184. 统计共同度过的日子数
    leetcode6184.统计共同度过的日子数题目描述Alice和Bob计划分别去罗马开会。给你四个字符串arriveAlice,leaveAlice,arriveBob和leaveBob。Alice会在日期arr......
  • [LeetCode] 2007. Find Original Array From Doubled Array
    Anintegerarray original istransformedintoa doubled array changed byappending twicethevalue ofeveryelementin original,andthenrandomly sh......
  • 【Leetcode】64. 最小路径和
    题目(链接)给定一个包含非负整数的m x n网格grid,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。说明:每次只能向下或者向右移动一步。示例1:输入:grid=......
  • [leetcode 876] 链表的中间节点
    [leetcode876]链表的中间节点给定一个头结点为head 的非空单链表,返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点。示例1:输入:[1,2,3,4,5]输出:此列......
  • Leetcode 1707 与数组中元素的最大异或值
    1707.与数组中元素的最大异或值难度困难  给你一个由非负整数组成的数组nums。另有一个查询数组queries,其中queries[i]=[xi,mi]。第i个查询的答案是xi......
  • Leetcode 907 子数组的最小值之和
    给定一个整数数组arr,找到min(b) 的总和,其中b的范围为arr的每个(连续)子数组。由于答案可能很大,因此返回答案模10^9+7。 示例1:输入:arr=[3,1,2,4]输出:17解......
  • leetcode 101. Symmetric Tree 对称二叉树(简单)
    一、题目大意给你一个二叉树的根节点root,检查它是否轴对称。示例1:输入:root=[1,2,2,3,4,4,3]输出:true示例2:输入:root=[1,2,2,null,3,null,3]输出:false......