输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
输入:{8,8,#,9,#,2,#,5},{8,9,#,2}
输出:true
思路一: 对于两棵二叉树来说,要判断B是不是A的子结构 ,首先先找到数A中和树B值一样的节点。找到了这一节点之后再分别判断两个左子节点是否相等和两个右子节点是否相等。
- 首先,我们先查找到这个相等的节点,采用递归的方法来遍历整棵树
- 找到这个节点之后,第二步我们用另一个递归来分别比较左子节点和右子节点。
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.DoesTree1haveTree2(pRoot1,pRoot2)
if not result:
result = self.HasSubtree(pRoot1.left, pRoot2)
if not result:
result = self.HasSubtree(pRoot1.right, pRoot2)
return result
def DoesTree1haveTree2(self, pRoot1, pRoot2):
if pRoot2 == None:
return True
if pRoot1 == None:
return False
if pRoot1.val !=pRoot2.val:
return False
return self.DoesTree1haveTree2(pRoot1.left,pRoot2.left) and self.DoesTree1haveTree2(pRoot1.right,pRoot2.right)
注: DoesTree1haveTree2里的两个if切记不能颠倒顺序,因为如果先判断pRoot1若等于None,直接返回False,但是进入这个方法的前提条件是pRoot1.val == pRoot2.val,则pRoot2=None,判错。