1.题目描述
给定两个非空二叉树 s 和 t,检验 s 中是否包含和 t 具有相同结构和节点值的子树。s 的一个子树包括 s 的一个节点和这个节点的所有子孙。s 也可以看做它自身的一棵子树。
示例:
给定的树 s:
3
/ \
4 5
/ \
1 2
给定的树 t:
4
/ \
1 2
返回 true,因为 t 与 s 的一个子树拥有相同的结构和节点值。
给定的树 s:
3
/ \
4 5
/ \
1 2
/
0
给定的树 t:
4
/ \
1 2
返回 false。
2.分析
-
2.1 先知道如何判断两棵树是否相等
相等的条件:
1.两棵树根结点相等
2.并且s的左子树=t的左子树
3.并且s的右子树=t的右子树 -
2.2 再判断t是否属于s的子树
t为s子树的条件:
1.两棵树相等
2.t是s的左子树
3.t是s的右子树
3.python代码示例
class TreeNode:
def __init__(self, val):
self.val = val
self.left = None
self.right = None
class Solution:
def is_subtree(self, s: TreeNode, t: TreeNode):
"""
判断t是否是s的子树
判断条件:
1.s和c_tree相等
2.或t是s的左子树
3.或t是s的右子树
"""
if s is None and t is None:
return True
if s is None or t is None:
return False
return self.is_same(s, t) or self.is_subtree(s.left, t) or self.is_subtree(s.right, t)
def is_same(self, s: TreeNode, t: TreeNode):
"""
判断两棵树是否相等
判断条件:
1.根结点相等
2.且s的左子树=t的左子树
3.且s的右子树=t的右子树
"""
if s is None and t is None:
return True
if s is None or t is None:
return False
return s.val == t.val and self.is_same(s.left, t.left) and self.is_same(s.right, t.right)
# 测试
s = TreeNode(4)
s.left = TreeNode(2)
s.left.left = TreeNode(1)
s.left.right = TreeNode(3)
s.right = TreeNode(9)
s.right.left = TreeNode(7)
s.right.left.left = TreeNode(6)
s.right.left.right = TreeNode(8)
s.right.right = TreeNode(10)
# s树结构
# 4
# / \
# 2 9
# / \ /
# 1 3 7
# / \
# 6 8
# t树结构
# 4
# / \
# 2 9
# / \ /
# 1 3 7
# / \
# 6 8
t = TreeNode(4)
t.left = TreeNode(2)
t.left.left = TreeNode(1)
t.left.right = TreeNode(3)
t.right = TreeNode(9)
t.right.left = TreeNode(7)
t.right.left.left = TreeNode(6)
t.right.left.right = TreeNode(8)
t.right.right = TreeNode(10)
d = TreeNode(7)
d.left = TreeNode(6)
d.right = TreeNode(8)
# 7
# / \
# 6 8
result1 = Solution().is_same(s, t)
result2 = Solution().is_subtree(s, d)
print(result1) # True
print(result2) # True