题目描述
输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
输入输出示例
- 示例1
输入:{8,8,#,9,#,2,#,5},{8,9,#,2}
返回值:true - 示例2
输入:{8,8,#,9,#,2,#,5},{8,9,#,3}
返回值:false
解题思路
使用递归。
考虑为空的情况;
判断两个树的根节点是否相等,如果相等则递归进行左右子树的比对;如果不相等,则继续遍历A树的左右子树,看是否与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 pRoot1 == None or pRoot2 == None:
return False
# 判断两个树的根节点相等时,递归判断左右子树的值是否相等
# 递归1
if pRoot1.val == pRoot2.val:
if self.isEqual(pRoot1, pRoot2):
return True
# 如果两个树的根节点不相等,则递归A的左右子树,
# 递归2
return self.HasSubtree(pRoot1.left, pRoot2) or self.HasSubtree(pRoot1.right, pRoot2)
def isEqual(self, root1, root2):
# 递归终止:B树遍历结束,B一定是A的子树
if root2 == None:
return True
# 递归终止:A树遍历结束,B一定不是A的子树
if root1 == None:
return False
# 递归对比两个树对应节点是否相等
if root1.val == root2.val:
# if root2.left == None:
# return True
# else:
# leftEqual = self.isEqual(root1.left, root2.left)
# if root2.right == None:
# return True
# else:
# rightEqual = self.isEqual(root1.right, root2.right)
# return leftEqual and rightEqual
return self.isEqual(root1.left, root2.left) and self.isEqual(root1.right, root2.right)
return False