题目描述
输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)。
读题,首先,这是一道二叉树的题,那基本上就和递归、指针有关了,虽然python里并没有指针的概念,但是在做编程题的时候,要领会指针的思想。
先回顾一下二叉树的定义:
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
如何判断B树是不是A树的子结构,既然是子结构,那就是每个节点对应相等,那首先,得在A树中找到一个和B树的根节点相等的节点吧。
这就是第一步,先递归遍历二叉树A,找A中和B的根节点相等的节点。
二叉树的遍历通常都是递归遍历,左右两个方向进行递归,而递归边界就是判断传进来的这个节点是不是空节点。
def HasSubtree(self, pRoot1, pRoot2):
# write code here
result = False
if not pRoot1:
return
if not pRoot2:
return
if pRoot1.val == pRoot2.val:
result = self.DoesTree1HaveTree2(pRoot1,pRoot2)
#可以看到,如果result不是true,就是这个节点下的结构不是子树时,会继续递归遍历
if not result:
result = self.HasSubtree(pRoot1.left,pRoot2)
if not result:
result = self.HasSubtree(pRoot1.right,pRoot2)
return result
然后,顺着这个相等的节点,我们可以进行第二步了。这时另写一个函数,作为判断这个相等节点下的结构是不是就和B树相同。
def DoesTree1HaveTree2(self,pRoot1,pRoot2):
if pRoot2 == None:#B树结束了,A树还没完,那肯定是包含
return True
if pRoot1 == None:#A树结束了,B树还没完,那肯定不包含了
return False
if pRoot1.val != pRoot2.val:#两个树对应点的值不相等,不用继续了,不包含
return False
#经历过上面的筛选后,这个节点通过了考验,
#继续向下,判断各自的左右子节点是否一样
#用递归方法可以直接写出
return self.DoesTree1HaveTree2(pRoot1.left,pRoot2.left) and self.DoesTree1HaveTree2(pRoot1.right,pRoot2.right)
最后完整代码如下:
# -*- coding:utf-8 -*-
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
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)
def HasSubtree(self, pRoot1, pRoot2):
# write code here
result = False
if not pRoot1:
return
if not pRoot2:
return
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