判断 t1 树中是否含有与 t2 树拓扑结构完全相同的子树
题目
给定两棵树t1, t2的根节点root1, root2,判断t1中是否有与t2拓扑结构完全相同的子树。
思路
其实就是判断t2是不是t1的子树,可以得到两棵树的先序序列s1和s2,判断s2是不是s1的子串。
TreeNode
"""
Data Structures And Algorithms:
check if tree2 is subtree of tree1
leetcode 572:
https://leetcode-cn.com/submissions/detail/40892514/
"""
class TreeNode(): # pylint: disable=too-few-public-methods
"""
Binary Tree Node
"""
def __init__(self, val, left=None, right=None):
self.val = val
self.left = left
self.right = right
实现
def serialize(root):
"""
serialize tree to string
:param root: the root of tree
"""
def preorder(node):
"""
serialize by pre order traversal
:param node: the current node to traversal
"""
if not node:
return '#|'
res = '(' + str(node.val) + ')'
res += preorder(node.left)
res += preorder(node.right)
return res
return preorder(root)
def is_subtree(root1, root2):
"""
check if tree t2 is subtree of t1
:param root1: the root of tree1
:param root2: the root of tree2
"""
serialize_str1 = serialize(root1)
serialize_str2 = serialize(root2)
return serialize_str2 in serialize_str1
测试
另一种实现
def is_subtree2(root1, root2):
"""
check if tree t2 is subtree of t1
:param root1: the root of tree1
:param root2: the root of tree2
"""
def to_tupple(node):
if node is None:
return None
return (node.val, to_tupple(node.left), to_tupple(node.right))
return str(to_tupple(root2)) in str(to_tupple(root1))