652.寻找重复的子树

https://leetcode-cn.com/problems/find-duplicate-subtrees/

一、递归遍历

在树中找结构相同的子树,一定是先子节点再根节点,即后序遍历。

写出框架

def travel(root):
	if root空: return
	left = travel(root.left)
	right travel(root.right)
	得到序列,判断

得到遍历序列后再比较,经过尝试发现前序后序均可,唯独中序不行。注意前序定义是根、左、右,其实根、右、左在逻辑上和前序是等价的。后序亦然

class Solution:
    def findDuplicateSubtrees(self, root: Optional[TreeNode]) -> List[Optional[TreeNode]]:
        self.hash = {}	#存储重复序列
        self.res = []	 #结果
        def traval(root):
            if not root:
                return 'null'
            left = traval(root.left)
            right = traval(root.right)
            # 以下几种顺序均可
            s =  str(root.val) + ',' + str(left) + ',' + str(right)  #前序
            # s =  str(root.val) + ',' + str(right) + ',' + str(left)  #还是前序
            # s =  str(right)+ ',' + str(left) + ',' + str(root.val) 	#后序
            # s =  str(left)+ ',' + str(right) + ',' + str(root.val)   	#也是后序
            # 统计出现次数
            self.hash[s] = self.hash.get(s, 0) + 1	
            if self.hash[s] == 2:
                self.res.append(root)		#遇到重复的序列,把根(而不是序列)加入结果
            return s	#记得返回序列
        
        traval(root)
        return self.res

最后更新于