1.题目描述
输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
2.解题思路
首先第一步在树A中查找与B根节点的值一样的节点:递归思想,如果根节点相同则递归调用isPart(),如果根节点不相同,则判断tree1的左子树和tree2是否相同,再判断右子树和tree2是否相同
第二步就是判断树A中以R为根节点的子树是不是和树B具有相同的结构。这里同样利用到了递归的方法,如果节点R的值和树的根节点不相同,则以R为根节点的子树和树B肯定不具有相同的节点;如果它们值是相同的,则递归的判断各自的左右节点的值是不是相同。递归的终止条件是我们达到了树A或者树B的叶节点。
3.代码实现
# -*- coding:utf-8 -*-
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
# 从两棵树的根节点开始比较
def isPart(self,p1,p2):
# B先为空,说明B被先遍历完了,B是子结构
if not p2:
return True
# A先为空,说明A先被遍历完了,B不可能是子结构了
if not p1 or p1.val!=p2.val:
return False
return self.isPart(p1.left,p2.left) and self.isPart(p1.right,p2.right)
def HasSubtree(self, pRoot1, pRoot2):
# write code here
if not pRoot1 or not pRoot2:
return False
if self.isPart(pRoot1,pRoot2):
return True
return self.isPart(pRoot1.left,pRoot2) or self.isPart(pRoot1.right,pRoot2)