题目描述:

输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)

解题思路:
判断二叉树B是否为二叉树A的子结构,需要分为两步进行实现:
1、递归遍历二叉树A,若A当前节点的值与二叉树B父节点相等,则判断A当前节点所在的子树是否存在与二叉树B相同的子树。
2、判断当前节点下是否存在与二叉树B相同的子树。
代码及解析:(以注释的方式添加解析)

# -*- 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:  # 若两棵树其中一棵为空,返回False
            return False
        result = False   # 初始化结果值
        if (pRoot1.val == pRoot2.val):       # 若当前节点的值与pRoot2的节点值相等,则判断当前节点是否存在与pRoot2相等的子树
            result = self.is_equal(pRoot1, pRoot2)
         # 若当前节点下不存在与pRoot2相等的子树,则递归判断当前节点的左子树和右子树是否存在与pRoot2相等的子树
        if not result:  
            result = self.HasSubtree(pRoot1.left, pRoot2)
        if not result:
            result = self.HasSubtree(pRoot1.right, pRoot2)
        return result
        
    def is_equal(self, pRoot1, pRoot2):
        if not pRoot2:   # 若pRoot2为空,证明递归过程中一直没有触发返回False的条件,直接返回True
            return True
        if not pRoot1:
            return False
        result = True
        # 判断pRoot1当前节点的值是否等于pRoot2当前节点的值
        if pRoot1.val != pRoot2.val:
            result = False
         # 若pRoot1当前节点的值等于pRoot2当前节点的值,则递归判断左子树和右子树是否相等
        if result:
            result = self.is_equal(pRoot1.left, pRoot2.left)
        if result:
            result = self.is_equal(pRoot1.right, pRoot2.right)
        return result