题目:输入两棵二叉树A和B,判断B是不是A的子结构。
解题思路:递归,注意空指针的情况。
# 判断B树是否是A树的一个子树
# 定义树节点
class BinaryTreeNode:
def __init__(self, data=None, left=None, right=None):
self.data = data # 树节点数字
self.left = left # 树节点左指针
self.right = right # 树节点右指针
# 定义判断是否为子树的类
class Solution:
# 判断两个数是否相等
def Equal(self, num1, num2):
if abs(num1-num2)<0.0000001:
return True
else:
return False
# 1.判断两个数是否有相同的根节点
def HasSubRoot(self, pRoot1, pRoot2):
result = False
if pRoot1!=None and pRoot2!=None:
if self.Equal(pRoot1.data, pRoot2.data):
# 判断B树是否是A的子树
result = self.DoesTree1IsTree2(pRoot1, pRoot2)
if not result:
result = self.HasSubRoot(pRoot1.left, pRoot2)
if not result:
result = self.HasSubRoot(pRoot1.right, pRoot2)
return result
# 2.判断根节点相同的树,是否B是A的子树
def DoesTree1IsTree2(self, pRoot1, pRoot2):
if pRoot2 is None:
return True
if pRoot1 is None:
return False
return self.DoesTree1IsTree2(pRoot1.left, pRoot2.left) and self.DoesTree1IsTree2(pRoot1.right, pRoot2.right)
if __name__=="__main__":
# 创建A树
treeA = BinaryTreeNode(1)
treeA.left = BinaryTreeNode(2)
treeA.right = BinaryTreeNode(3)
treeA.left.left = BinaryTreeNode(4)
treeA.left.right = BinaryTreeNode(5)
# 创建B树
treeB = BinaryTreeNode(2)
treeB.left = BinaryTreeNode(4)
treeB.right = BinaryTreeNode(5)
solution = Solution()
result = solution.HasSubRoot(treeA, treeB)
print(result)