题目描述
解决方案
使用序列化的方式解决
一种朴素的方法是,将每个节点为根的子树都保存下来,之后进行比较就可以得到最终的结果。但是如何保存一棵树是一个难点。一种解决方法是我们将树的值按照先序遍历的的方式保存到字符串中,就是序列化。
有了这个概念之后,我们就可以将每个子树的序列化结果保存到哈希表中,通过比较子树序列化的结果来找到重复的子树。
我们可以使用递归的方式进行树的序列化,并在递归的过程中保存从叶子到根的子树序列化值,可以减少计算重复的次数。
序列化递归的python代码为
def construct(root):
if root is None: return '#'
serial = f'{root.val},{construct(root.left)},{construct(root.right)}'
return serial
完整题目的解答代码为:
# 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: TreeNode) -> List[TreeNode]:
self.mp = {}
self.ans = []
self.construct(root)
return self.ans
def construct(self, root):
if root is None: return '#'
serial = f'{root.val},{self.construct(root.left)},{self.construct(root.right)}'
if(serial not in self.mp.keys()):
self.mp[serial] = 1
else:
self.mp[serial] +=1
if(self.mp[serial]==2):
self.ans.append(root)
return serial