题目描述
输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
思路
《剑指offer》P117
判断主要分两个步骤:
- 两棵树的当前节点值是否相等。
- 不相等,则将树A指针移动到其左/右孩子节点再判断
- 相等,则同时移动两棵树的指针,判断其左右孩子值是否相等
code
# -*- 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
result = False
if pRoot1 and pRoot2:
# 如果当前两个结点值相等,则以此为根节点判断后面的结点是不是能够成子树
if pRoot1.val == pRoot2.val:
result = self.isSubTree(pRoot1, pRoot2)
# 如果当前节点不能构成子树,则将树A分别向左/右子节点移动,再比较
if not result:
result = self.HasSubtree(pRoot1.right, pRoot2)
if not result:
result = self.HasSubtree(pRoot1.left, pRoot2)
return result
def isSubTree(self, pRoot1, pRoot2):
# 如果树B到达空结点,说明前面判断的值都相等,则返回True
if not pRoot2:
return True
# 如果树B结点不为空,树A已经为空,说明不是子树
if not pRoot1:
return False
if pRoot1.val != pRoot2.val:
return False
else:
return self.isSubTree(pRoot1.left, pRoot2.left) and self.isSubTree(pRoot1.right, pRoot2.right)