题目
给定两个非空二叉树 s 和 t,检验 s 中是否包含和 t 具有相同结构和节点值的子树。s 的一个子树包括 s 的一个节点和这个节点的所有子孙。s 也可以看做它自身的一棵子树。
示例 1:
给定的树 s:
3
/ \
4 5
/ \
1 2
给定的树 t:
4
/ \
1 2
返回 true,因为 t 与 s 的一个子树拥有相同的结构和节点值。
示例 2:
给定的树 s:
3
/ \
4 5
/ \
1 2
/
0
给定的树 t:
4
/ \
1 2
返回 false。
解题思路
和牛客的一道题很像,不过牛客问的是子结构,这里是子树。判断子树,首先根节点是否相同,如果相同,则看两棵树是否完全一样(是否此处就是相同的部分)+大树左子树和小树+大树右子树和小树,如果不相同,看大树的左子树和小树、大树的右子树和小树
注意其实不相同和相同中有一部分通用的,即无论如何都需要比较大树的左子树和小树、大树的右子树和小树,所以直接提取这部分出来比较即可
比较的部分用递归
代码
# 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 is_same_tree(self, root1: TreeNode, root2: TreeNode) -> bool:
if (not root1) and (not root2):
return True
if (not root1) or (not root2):
return False
if root1.val != root2.val:
return False
return self.is_same_tree(root1.left, root2.left) and self.is_same_tree(root1.right, root2.right)
def isSubtree(self, s: TreeNode, t: TreeNode) -> bool:
if (not s) and (not t):
return True
if (not s) or (not t):
return False
return self.is_same_tree(s, t) or self.isSubtree(s.left, t) or self.isSubtree(s.right, t)