题目内容
输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
题目思路
因为作为结果的空判定和输入的空判定逻辑并不一样,所以最好分开写成两个函数。第一个原函数用来判定输入的元素是否符合输入的要求,不符合直接抛出。第二个函数用来判定是否为子树。判定1:如果这当前的两个树的根相同,那么分别判断左侧和右侧,直到全部判定完B树。判定2:如果不同的话,就试试A的左侧或者右侧树为根和B判定。这里有一种可能是A和B的根节点是符合的,但是在向下判定的过程中出现了问题,在这种情况下,必须要能够回退到根进行判定2,否则就会停止运算直接输出结果了。.所以要加入一个res变量。
程序代码
# -*- coding:utf-8 -*-
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def HasSubtree(self, pRoot1, pRoot2):
# write code here
if not pRoot1 or not pRoot2:
return False
return self.isSubtree(pRoot1, pRoot2)
def isSubtree(self, p1, p2):
if not p2:
return True
if not p1:
return False
res = False
if p1.val == p2.val:
res = self.isSubtree(p1.left, p2.left) and self.isSubtree(p1.right, p2.right)
return res or self.isSubtree(p1.left, p2) or self.isSubtree(p1.right, p2)