题目:输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
思路:
1、HasSubtree使用递归遍历A树,在A中查找与B根节点值一样的节点R,若根节点不等,则向左子树、右子树找与B根节点相等的节点
2、若找到A中与B根节点相等的节点R,则调用DoesTree1HaveTree2,使用递归判断R和B子树是不是具有相同的值,终止条件是到达R或者B的叶子节点
3、若B树先遍历完成,则返回True,若R树先遍历完成,或者RB具有不同值,则返回False,回到1继续搜索,仅当左右子树均相同时返回True
# -*- coding:utf-8 -*-
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def DoesTree1HaveTree2(self, pRoot1, pRoot2):
if pRoot2 == None:
return True
if pRoot1 == None:
return False
if pRoot2.val != pRoot1.val:
return False
return self.DoesTree1HaveTree2(pRoot1.left, pRoot2.left) and self.DoesTree1HaveTree2(pRoot1.right, pRoot2.right)
def HasSubtree(self, pRoot1, pRoot2):
# write code here
if pRoot1 is None or pRoot2 is None:
return False
result = False
if pRoot1.val == pRoot2.val:
result = self.DoesTree1HaveTree2(pRoot1, pRoot2)
if result == False:
result = self.HasSubtree(pRoot1.left, pRoot2)
if result == False:
result = self.HasSubtree(pRoot1.right, pRoot2)
return result