题目描述
输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
# -*- 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!=None and pRoot2!=None:
if pRoot1.val==pRoot2.val:
result=self.DoseTree1HaveTree2(pRoot1,pRoot2)
if not result:
result=self.HasSubtree(pRoot1.left,pRoot2)
if not result:
result=self.HasSubtree(pRoot1.right,pRoot2)
return result
def DoseTree1HaveTree2(self,pRoot1,pRoot2):
if pRoot2==None:
return True
if pRoot1==None:
return False
if pRoot1.val!=pRoot2.val:
return False
return self.DoseTree1HaveTree2(pRoot1.left,pRoot2.left) and self.DoseTree1HaveTree2(pRoot1.right,pRoot2.right)
读一遍找相同的根节点,第二步查看子树是否相同。留意指针为空的各种情况。
其中利用self.调用类的函数(方法)
特别的:
有地方要重点注意,DoesTree1haveTree2()函数中的两个 if 判断语句 不能颠倒顺序 。
因为如果颠倒了顺序,会先判断pRoot1 是否为None, 其实这个时候,pRoot1 的节点已经遍历完成确认相等了,但是这个时候会返回 False,判断错误。
疑问:黄字部分,当二叉树B递归完(pRoot==None)时,return True;当A,B节点不相等,或A树节点数少于B树时。return False。