《剑指Offer》刷题之树的子结构
我不知道将去向何方,但我已在路上! |
---|
时光匆匆,虽未曾谋面,却相遇于斯,实在是莫大的缘分,感谢您的到访 ! |
- 题目:
输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构) - 示例:
输入:{8,8,#,9,#,2,#,5},{8,9,#,2}
返回值:true
class Solution:
def HasSubtree(self, pRoot1, pRoot2):
result = False
if pRoot1 != None and pRoot2 != None:
if pRoot1.val == pRoot2.val:
result = self.function(pRoot1, pRoot2)
if not result:
result = self.HasSubtree(pRoot1.left, pRoot2)
if not result:
result = self.HasSubtree(pRoot1.right, pRoot2)
return result
def function(self, pRoot1, pRoot2):
if pRoot2 == None:
return True
if pRoot1 == None:
return False
if pRoot1.val != pRoot2.val:
return False
return self.function(pRoot1.left, pRoot2.left) and self.function(pRoot1.right, pRoot2.right)
- 建立子函数
function()
,判断树的每个节点是否相同;
其中参数pRoot2
代表子树,参数pRoot1
代表原树,
判断子树pRoot2
是不是为空,如果为空,说明是子结构,返回True
,
判断原树pRoot1
是不是为空,如果为空,说明原树pRoot1
无法包含子树pRoot2
,返回False
,
判断子树pRoot2
和原树pRoot1
的当前值是否相等,如果不相等,说明子结构不是从当前节点开始,返回False
,
如果相等,递归调用函数function()
。 - 函数
HasSubtree()
判断子结构,设置result
作为标志位;
判断pRoot1
和pRoot2
,当两者有任意一个为空的时候,返回False,
当两者都不为空的时候,调用function()
函数更新标志位result
,
如果result
还不是True
,继续遍历原树pRoot1
左子树pRoot1.left
、右子树pRoot1.right
,找和子树pRoot2
根节点相等的节点。 - 返回标志位
result
。