LeetCode 652: 寻找重复的子树 Find Duplicate Subtrees

简介:

LeetCode 652: 寻找重复的子树 Find Duplicate Subtrees

题目:

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

两棵树重复是指它们具有相同的结构以及相同的结点值。

Given a binary tree, return all duplicate subtrees. For each kind of duplicate subtrees, you only need to return the root node of any one of them.

Two trees are duplicate if they have the same structure with same node values.

示例 1:

        1
       / \
      2   3
     /   / \
    4   2   4
       /
      4

下面是两个重复的子树:

      2
     /
    4

    4

因此,你需要以列表的形式返回上述重复子树的根结点。

Therefore, you need to return above trees' root in the form of a list.

解题思路:

这就是一道考察二叉树遍历的题, 遍历的时候序列化作为 String 类型存入 Map, 若其为第二次出现即将该结点加入数组.

代码:

这里以后序遍历为例, 需要注意叶子结点应当规定一个特殊字符作为替代 null 结点, 这里用的是 '#'

Java:

class Solution {
    public List<TreeNode> findDuplicateSubtrees(TreeNode root) {
        List<TreeNode> list = new ArrayList<>();//待返回数组
        if (root == null) return list;
        Map<String, Integer> map = new HashMap<>();//哈希映射查找重覆子结点
        traverse(root, map, list, "");
        return list;
    }
    //后序遍历
    private String traverse(TreeNode node, Map<String, Integer> map, List<TreeNode> list, String tree) {
        if (node == null) return tree + "#";
        String left = traverse(node.left, map, list, tree);//递归左子孩子
        String right = traverse(node.right, map, list, tree);//递归右子孩子
        tree = tree + node.val + left + right;//每个子树路径

        map.put(tree, map.getOrDefault(tree, 0) + 1);//存储每个子树路径
        if (map.get(tree) == 2) list.add(node);//第二次出现相同路径时存储该结点
        return tree;
    }
}

Python:

class Solution:
    def findDuplicateSubtrees(self, root: TreeNode) -> List[TreeNode]:
        res = [] # 待返回数组
        if not root: return res
        hash_map = {} # 哈希映射查找重覆子结点
        self.traverse(root, hash_map, res, '')
        return res
    # 后序遍历
    def traverse(self, node: TreeNode, hash_map, res, tree):
        if not node: return tree + '#'
        left = self.traverse(node.left, hash_map, res, tree) # 递归左子孩子
        right = self.traverse(node.right, hash_map, res, tree) # 递归右子孩子
        tree = tree + str(node.val) + left + right # 每个子树路径
        if tree in hash_map.keys(): # 存储每个子树路径
            hash_map[tree] += 1
        else:
            hash_map[tree] = 1
        if hash_map[tree] == 2: # 第二次出现相同路径时存储该结点
            res.append(node)
        return tree

欢迎关注微信公众号: 爱写Bug

目录
相关文章
|
3月前
|
Python
【Leetcode刷题Python】剑指 Offer 26. 树的子结构
这篇文章提供了解决LeetCode上"剑指Offer 26. 树的子结构"问题的Python代码实现和解析,判断一棵树B是否是另一棵树A的子结构。
50 4
|
3月前
|
Python
【Leetcode刷题Python】538. 把二叉搜索树转换为累加树
LeetCode上538号问题"把二叉搜索树转换为累加树"的Python实现,使用反向中序遍历并记录节点值之和来更新每个节点的新值。
21 3
|
6月前
|
算法 C语言 容器
从C语言到C++_25(树的十道OJ题)力扣:606+102+107+236+426+105+106+144+94+145(下)
从C语言到C++_25(树的十道OJ题)力扣:606+102+107+236+426+105+106+144+94+145
64 7
|
6月前
|
C语言
从C语言到C++_25(树的十道OJ题)力扣:606+102+107+236+426+105+106+144+94+145(中)
从C语言到C++_25(树的十道OJ题)力扣:606+102+107+236+426+105+106+144+94+145
54 1
|
6月前
|
算法 C语言 C++
从C语言到C++_25(树的十道OJ题)力扣:606+102+107+236+426+105+106+144+94+145(上)
从C语言到C++_25(树的十道OJ题)力扣:606+102+107+236+426+105+106+144+94+145
40 1
|
6月前
LeetCode———100——相同的树
LeetCode———100——相同的树
|
6月前
力扣337.打家劫舍3(树形dp)
力扣337.打家劫舍3(树形dp)
|
5月前
|
SQL 算法 数据可视化
LeetCode题目99:图解中叙遍历、Morris遍历实现恢复二叉树搜索树【python】
LeetCode题目99:图解中叙遍历、Morris遍历实现恢复二叉树搜索树【python】
|
5月前
|
存储 SQL 算法
LeetCode题目100:递归、迭代、dfs使用栈多种算法图解相同的树
LeetCode题目100:递归、迭代、dfs使用栈多种算法图解相同的树
|
5月前
|
存储 算法 数据可视化
python多种算法对比图解实现 验证二叉树搜索树【力扣98】
python多种算法对比图解实现 验证二叉树搜索树【力扣98】