题目描述
输入两棵二叉树A和B,判断B是不是A的子结构。(约定空树不是任意一个树的子结构)
B是A的子结构, 即 A中有出现和B相同的结构和节点值。
例如:
给定的树 A:
3
/ \
4 5
/ \
1 2
给定的树 B:
4
/
1
返回 true,因为 B 与 A 的一个子树拥有相同的结构和节点值。
示例 1:
输入:A = [1,2,3], B = [3,1] 输出:false
示例 2:
输入:A = [3,4,5,1,2], B = [4,1] 输出:true
限制:
0 <= 节点个数 <= 10000
本题是要判断B是否为A的一部分,也就是说B和A的某个子树结构完成一样, 所以本题应该包括两部分,一是遍历A的每个结点,二判断A的每个结点下的树是否与B的结构相同。
如何判断两个子树完全相同,首先二者的结构相同,也就是两个树的每个位置是否为空都是一样的,然后在此基础上每个位置的值也是一样的。那么我们的做法就是先判断A和B的根节点是否相同,然后再递归判断他们的左右子树是否相同,递归的终止条件就是B为空或者A为空,因为B为空时说明已经越过叶子结点,在这之前遍历到的位置都相同;A为空时说明越过了A的叶子结点,而B还不为空,那么就说明A与B不同。
然后先序遍历A的每个结点,进行上述判断。代码如下:
class Solution(object):
def isSubStructure(self, A, B):
"""
:type A: TreeNode
:type B: TreeNode
:rtype: bool
"""
def recur(a,b):
if not b:
return True
return a and a.val == b.val and recur(a.left,b.left) and recur(a.right,b.right)
def pre(root):
if not root:
return False
if recur(root,B):
return True
return pre(root.left) or pre(root.right)
if not B:
return False
return pre(A)