一. 题目描述
给定一棵二叉树,返回所有重复的子树。对于同一类的重复子树,你只需要返回其中任意一棵的根结点即可。
两棵树重复是指它们具有相同的结构以及相同的结点值。
示例 1:
1 / \ 2 3 / / \ 4 2 4 / 4
下面是两个重复的子树:
2 / 4
和
4
因此,你需要以列表的形式返回上述重复子树的根结点。
二. 思路
乍一看,会觉得有点麻烦,不知道从何下手,不过这道题本身是一个查重的问题,那么就很容易想到,存放的数据结构是哈希表,然后,题目要求找到的是重复出现的子树,也就是说,我们要存放在哈希表中的元素就是每一棵子树,那么问题就转换成,怎么表示一棵子树,或者是怎么判断子树是否重复的问题。
这里就需要明确一个结论,前序遍历相等的树,其树结构也相同(这里的遍历结果包含叶节点为None的叶节点)。那么这就好办了,只需要记录每个节点的前序遍历就ok了。
三. 代码
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution(object):
def DLR(self, root, orders, res):
if root is None:
return '#END#'
# 前序,后序都可以
my_order = str(root.val) + '\t' + self.DLR(root.left, orders, res) + '\t' + self.DLR(root.right, orders, res)
if orders.get(my_order, 0) == 1:
res.append(root)
orders[my_order] = max(1, orders.get(my_order, 0) + 1)
return my_order
def findDuplicateSubtrees(self, root):
"""
:type root: TreeNode
:rtype: List[TreeNode]
"""
orders = dict()
res = list()
self.DLR(root, orders, res)
return res
四. 参考
1. leetcode: https://leetcode-cn.com/explore/learn/card/hash-table/206/practical-application-design-the-key/823/