描述
输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
首先还是复习下树的概念。
树包含node、edge、root。
节点(Node):树中的每一个数据元素成为一个节点,节点是树的基本构成部分。
边(Edge):边也是树的基本构成部分。边有方向,连接两个节点,并表示它们之间的联系。
根节点(Root):根节点是树中唯一一个没有入边的节点。
路径(Path):路径是由边连接起来的节点的有序排列。
子节点集(Children):当一个节点的入边来自另一个节点时,称前者是后者的子节点,同一个节点的所有子节点构成子节点集。
父节点(Parent):一个节点是它出边所连接的所有节点的父节点。
兄弟节点(Sibling):同一个节点的所有子节点互为兄弟节点。
子树(Subtree):子树是一个父节点的某个子节点的所有边和后代节点所构成的集合。
叶节点(Leaf Node):没有子节点的节点称为叶节点。
层数(Level):一个节点的层数是指从根节点到该节点的路径中的边的数目。
高度(Height):树的高度等于所有节点的层数的最大值。
Mooc的大学计算机-python算法实践中二叉树的实现。
然后回到题目里面,讨论组题解:对于两颗二叉树来说,要判断树B是不是树A的子结果,首先第一步在树A中查找与B根节点的值一样的节点。第二步就是判断树A中以R(B根节点的值)为根节点的子树是不是和树B具有相同的结构。
递归的终止条件是我们达到了树A或者树B的叶节点。
有地方要重点注意,DoesTree1haveTree2()函数中的两个 if 判断语句不能颠倒顺序。
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语句我有疑问,pRoot2等于None的时候,返回的是True。
解释是为了看看子结构是否遍历完(这道题还是不理解,多做几个树的题目再回来看)