输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)


递归设计思路:

A、判断子树根值是否相等。

A1、如果是相等,需要一个可以判断该根左右孩子结点是否相等的递归函数。

A2、如果不等,找大树的左右孩子结点当根结点,递归到A步骤。

 1 # -*- coding:utf-8 -*-
 2 # class TreeNode:
 3 #     def __init__(self, x):
 4 #         self.val = x
 5 #         self.left = None
 6 #         self.right = None
 7 class Solution:
 8     def HasSubtree(self, pRoot1, pRoot2):
 9         # write code here
10         res = False
11         if pRoot1 == None or pRoot2 == None :
12             #根据题干要求返回False
13             return res
14         if pRoot1.val == pRoot2.val:
15             #如果结点相等,Subtree函数负责判断
16             #这两个结点的孩子是否相等
17             res = Solution.Subtree(self, pRoot1, pRoot2)
18         if not res:
19             #当与小树相同的子树不在根部,找大树左子树
20             res = Solution.HasSubtree(self, pRoot1.left, pRoot2)
21         if not res:
22             #左边找到了就不需要再找了
23             res = Solution.HasSubtree(self, pRoot1.right, pRoot2)
24         return res
25     
26     def Subtree(self, pRoot1, pRoot2):
27         #下面两个if位置不能反
28         if pRoot2 == None:
29             return True
30         if pRoot1 == None:
31             return False
32         if pRoot1.val != pRoot2.val:
33             return False
34         #左右同时相等时
35         return Solution.Subtree(self, pRoot1.left, pRoot2.left) and \
36     Solution.Subtree(self, pRoot1.right, pRoot2.right)        

 

为了简化代码,提高代码的阅读障碍,使用短路法

 

 1 class Solution:
 2     def HasSubtree(self, pRoot1, pRoot2):
 3         # write code here
 4         if pRoot1 == None or pRoot2 == None :
 5             return False
 6         return Solution.Subtree(self, pRoot1, pRoot2) or \
 7     Solution.HasSubtree(self, pRoot1.left, pRoot2) or \
 8     Solution.HasSubtree(self, pRoot1.right, pRoot2)
 9     
10     def Subtree(self, pRoot1, pRoot2):
11         if pRoot2 == None:
12             return True
13         if pRoot1 == None:
14             return False
15         if pRoot1.val != pRoot2.val:
16             return False
17         return Solution.Subtree(self, pRoot1.left, pRoot2.left) and \
18     Solution.Subtree(self, pRoot1.right, pRoot2.right)

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM