LCR 143. 子结构判断
大约 2 分钟
---
LCR 143. 子结构判断
- 标签:树、深度优先搜索、二叉树
- 难度:中等
题目链接
题目大意
给定两棵二叉树的根节点 A、B。
要求:判断 B 是不是 A 的子结构。(空树不是任意一棵树的子结构)。
B是A的子结构:A中有出现和B相同的结构和节点值。
解题思路
深度优先搜索。
- 先判断特例,如果
A、B都为空树,则直接返回False。 - 然后递归判断
A、B是否相等。- 如果
A、B相等,则返回True。 - 如果
A、B不相等,则递归判断B是否是A的左子树的子结构,或者B是否是A的右子树的子结构,如果有一种满足,则返回True,如果都不满足,则返回False。
- 如果
递归判断 A、B 是否相等的具体方法如下:
- 如果
B为空树,则直接返回False,因为空树不是任意一棵树的子结构。 - 如果
A为空树或者A节点的值不等于B节点的值,则返回False。 - 如果
A、B都不为空,且节点值相同,则递归判断A的左子树和B的左子树是否相等,判断A的右子树和B的右子树是否相等。如果都相等,则返回True,否则返回False。
代码
class Solution:
def hasSubStructure(self, A: TreeNode, B: TreeNode) -> bool:
if not B:
return True
if not A or A.val != B.val:
return False
return self.hasSubStructure(A.left, B.left) and self.hasSubStructure(A.right, B.right)
def isSubStructure(self, A: TreeNode, B: TreeNode) -> bool:
if not A or not B:
return False
if self.hasSubStructure(A, B):
return True
return self.isSubStructure(A.left, B) or self.isSubStructure(A.right, B)