题目描述:
输入两棵二叉树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
if pRoot1==None and pRoot2 == None:
return False
def subtree(pr1,pr2):
if pr1==None and pr2==None:
return True
if pr1==None or pr2==None:
return False
if pr1.val==pr2.val:
if pr2.left==None and pr2.right==None:
return True
if subtree(pr1.left,pr2.left) and subtree(pr1.right,pr2.right):
return True
return subtree(pr1.left,pr2) or subtree(pr1.right,pr2)
return subtree(pRoot1,pRoot2)
思路:
(大树中是否包含小树)一棵树是不是另一棵树的子树,需要从根节点开始比起,若根节点相同,则分别比较二者的左右子树,如果根节点不同,则把大树的左(或右)子树看成一棵树,从根节点开始与小树比较。大致想法如此,但是实现细节还要注意。
第一,题目中要求空树不是任何树的子树,所以首先需要判断两棵树中是否有空树,若有一个是空树,则返回false.
大树为空树,则比不包含小树;小树为空树,不是任何树的子树。相必也是默认空树也不是空树的子树。
第二递归调用,表达要清晰。在subtree中若两个树都为空时,说明了两个原始的树并不是空,而是递归调用到子树为空了,这时说明两个树所在部分树是相同的。
如果还不理解还是拿例子两个树来理解。溜着程序走一遍就明白了。