寻找重复的子树
题目描述:
给定一棵二叉树,返回所有重复的子树。对于同一类的重复子树,你只需要返回其中任意一棵的根结点即可。
两棵树重复是指它们具有相同的结构以及相同的结点值。
示例 :
1
/ \
2 3
/ / \
4 2 4
/
4
下面是两个重复的子树:
2 4
/
4
因此,你需要以列表的形式返回上述重复子树的根结点。
解法
整个问题的核心在于如何将一棵二叉树进行序列化,或者说找到其唯一标识。序列化得到的序列需要保证能够反序列化,即能够重建二叉树,可以按照前序和后序进行序列化,中序不可以。至于原因,本人难以给出,在序列化时,对于空节点可以使用“null”来表示,不同节点的值之间用“,”隔开。因此直观来看,如果使用前序遍历或者后续遍历时,叶子节点前面会有两个“null”,容易辨识;而中序遍历则不太好确定(注:个人推测,请勿相信)。
代码
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def findDuplicateSubtrees(self, root: Optional[TreeNode]) -> List[Optional[TreeNode]]:
str2num = {}
res = []
self.func(root, str2num, res)
return res
def func(self, root, str2num, res):
if not root:
return "n"
left_str = self.func(root.left, str2num, res)
right_str = self.func(root.right, str2num, res)
cur_str = left_str + "," + right_str + "," + str(root.val)
if cur_str not in str2num:
str2num[cur_str] = 1
elif str2num[cur_str] == 1:
str2num[cur_str] = 2
res.append(root)
return cur_str
测试结果
执行用时:60 ms, 在所有 Python3 提交中击败了 53.52% 的用户
内存消耗:23.8 MB, 在所有 Python3 提交中击败了 65.02% 的用户
说明
算法题来源:力扣(LeetCode)