这道题本来写的代码很冗长,后来参考了别人写的代码精简了一下。总体思路就是先判断两个树是否为空树,如果为空,则直接返回False,如果不为空,那么就递归判断是否有子结构。
如果树2是树1的子结构,那么有三种情况,第一种是树1的根就是树2的根,然后左右子树也与树2的左右子树对应相等,也就是isSub(pRoot1, pRoot2),第二种是树2是树1的左子树的子结构,也就是self.HasSubtree(pRoot1.left, pRoot2),第三种是树2是树1的右子树的子结构,也就是self.HasSubtree(pRoot1.right, pRoot2)。如果不满足这三种情况中的任何一个,那么就说明树2不是树1的子结构。
接下来就是isSub函数的编写。采用递归的方式进行编写。如果root2指向的节点为空,那么无论root1指向的节点是否为空(由于初始时判断过两个树是否是空树,所以root1所在树一定不是空树,只是root1指向的节点为空),那么就说明root2所在树是root1所在树子结构。如果root2指向的节点非空,而root1指向节点为空,或者root1指向的值与root2指向的值不等,那么树2一定不是树1的子结构。之后就是递归判断root2的左子树是不是root1的的根节点值相同左子树的子结构,root2的右子树是不是root1的的根节点值相同右子树的子结构。只有左右子树都满足条件的时候,才返回True,否则返回False。
# -*- coding:utf-8 -*-
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
# root2是否是root1的根节点值相同的子结构
def isSub(self, root1, root2):
if root2 is None:
return True
if root1 is None or root1.val != root2.val:
return False
return self.isSub(root1.left, root2.left) and self.isSub(root1.right, root2.right)
# root2是否是root1的子结构
def HasSubtree(self, pRoot1, pRoot2):
# write code here
if pRoot1 is None or pRoot2 is None:
return False
return self.isSub(pRoot1, pRoot2) or self.HasSubtree(pRoot1.left, pRoot2) or self.HasSubtree(pRoot1.right, pRoot2)