652. 寻找重复的子树

简介: #### [652. 寻找重复的子树](https://leetcode.cn/problems/find-duplicate-subtrees/)

一、题目描述:

给定一棵二叉树 root,返回所有重复的子树。

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

如果两棵树具有相同的结构和相同的结点值,则它们是重复的。

示例 1:

img

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

img

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

img

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

提示:

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

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/find-duplicate-subtrees
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

二、思路分析:

首先解决如何寻找重复的问题,要找重复的子树,如果重复了就保存一个树的根节点。这已经提示我们,遍历整棵树的所有节点,遍历的时候我们想办法得到以这个结点为根的子树的情况是什么样子的,显然用序列化二叉树,如何记录重复?这里我想到用哈希如果对应子树的序列出现次数超过1次那么就重复了,需要在结果中加入该子树的根结点。
再就是如何遍历树?我们知道树分三种遍历方式:前序,中序和后序,这三种都是深度优先搜索DFS。当然还有层次遍历,广度优先搜索BFS是可行的,

三、AC 代码:

class Solution {
    Map<String,Integer> tree = new HashMap();
    List<TreeNode> answer = new LinkedList<>();
    public List<TreeNode> findDuplicateSubtrees(TreeNode root) {
        traverse(root);
        return answer;
    }
    private String traverse(TreeNode root) {
        if(root == null) {
            return "#";
        }
        //得到序列化后的左子树
        String leftTree = traverse(root.left);
        //得到序列化后的右子树
        String rightTree = traverse(root.right);
        String treeSub = root.val + "," + leftTree + "," + rightTree;
        int count = tree.getOrDefault(treeSub,0);
        //如果存在该子树
        if(count == 1) {
            answer.add(root);
        }
        //子树数量递增
        tree.put(treeSub,count+1);
        return treeSub;
    }
}
相关文章
代码随想录Day18 LeetCode235 二叉搜索树的公共祖先 T701二叉搜索树中的插入操作 T140 删除二叉搜索树中的公共节点
代码随想录Day18 LeetCode235 二叉搜索树的公共祖先 T701二叉搜索树中的插入操作 T140 删除二叉搜索树中的公共节点
33 0
|
1月前
3331. 修改后子树的大小
【10月更文挑战第11天】3331. 修改后子树的大小
21 7
|
7月前
|
数据库 索引
数据结构中平衡二叉树插入删除中左旋、右旋、左右双旋、右左双旋的详解(题目讲解 简单易懂)
数据结构中平衡二叉树插入删除中左旋、右旋、左右双旋、右左双旋的详解(题目讲解 简单易懂)
89 0
|
6月前
【树 - 平衡二叉树(AVL)】F(n)=F(n-1)+F(n-2)+1 这个类似于一个递归的数列,1是根节点,F(n-1)是左子树的节点数量,F(n-2)是右子树的节点数量
【树 - 平衡二叉树(AVL)】F(n)=F(n-1)+F(n-2)+1 这个类似于一个递归的数列,1是根节点,F(n-1)是左子树的节点数量,F(n-2)是右子树的节点数量
|
7月前
leetcode-652:寻找重复的子树
leetcode-652:寻找重复的子树
26 0
|
算法 DataX
删除二叉树子树
删除二叉树子树
129 0
二叉查找树的建立,删除,非递归和递归查找给定元素,非递归和递归查找最大元素结点和最小元素结点
二叉查找树的建立,删除,非递归和递归查找给定元素,非递归和递归查找最大元素结点和最小元素结点
#### [652. 寻找重复的子树](https://leetcode.cn/problems/find-duplicate-subtrees/)
#### [652. 寻找重复的子树](https://leetcode.cn/problems/find-duplicate-subtrees/)
9.删除链表中的重复结点
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
61 0
|
算法
Acwing 29.删除链表中的重复值(结点)
Acwing 29.删除链表中的重复值(结点)
91 0