树的子结构
题目
输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
解析
本题全程使用递归,因为要遍历树嘛,第一反应就可能需要递归来解决。那怎么解决呢?
两点:
第一点:A树从上到下遍历,看有没有两棵树的根节点的值相同
第二点:如果在某一个位置上,两棵树的根节点值相同,判断这个根节点往下,是否有相同的树结构。
注意是先判断有没有相同的结构,如果结构都不相同就不用判断值了,继续往下找有没有相同的根节点值;
# -*- 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
result = False
# 只有两个树存在了,才能继续判断
if pRoot1 and pRoot2:
# 判断两个树的根节点是否一样
if pRoot1.val == pRoot2.val:
# 当两个根节点的值存在了,判断是否有相同的树结构
# 要判断是否有相同的树结构,先定义一个判断树结构的函数
result = self.isEqual(pRoot1, pRoot2) # result为bool值
# result不存在,就证明根节点即使相同,也没有相同的结构
if not result:
result = self.HasSubtree(pRoot1.left, pRoot2)
# 如果结构依旧不存在,就证明根节点与左子树都不存在有B树相同的东西,判断右节点
if not result:
result = self.HasSubtree(pRoot1.right, pRoot2)
return result
def isEqual(self, root1, root2):
# root1:A树;roo2:B树
# 如果B树为空,那么直接就返回true(注意这个判断不是最上面的跟,根节点已经由主函数判断了)
if not root2:
return True
# 如果A树为空,那么直接返回False
if not root1:
return False
# 如果两个节点值都不一样,返回FALSE
if root1.val != root2.val:
return False
# 以上对于最上面的根节点都无效,而是在递归过程中需要这些出口
return self.isEqual(root1.left,root2.left) and self.isEqual(root1.right,root2.right)