题目:
给定一棵二叉树,返回所有重复的子树。对于同一类的重复子树,你只需要返回其中任意一棵的根结点即可。
两棵树重复是指它们具有相同的结构以及相同的结点值。
解题设计:
类似于hash表的原理,python采用字典的形式将子树作为键放入字典,所对应的值即是其出现的次数,若其已出现过一次,则可以将该子树存入序列中返回作为结果。在遍历的过程中,每个子树都被考虑,所以不需要进行额外的递归处理。
代码:
# 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 findDuplicateSubtrees(self, root):
"""
:type root: TreeNode
:rtype: List[TreeNode] """
arr=[]
m = collections.defaultdict(int)
self.find(root,m,arr)
return arr
def find(self,root,m,arr):
if not root:
return '#'
sontree=str(root.val)+','+self.find(root.left,m,arr)+','+self.find(root.right,m,arr)
if m[sontree]==1:
arr.append(root)
m[sontree]+=1
return sontree