题目描述:
输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
递归求解:
本题采用递归的思想,若pRoot1和pRoot2都是空树,则不是任意一个树的子结构;依次递归地比较它们的左、右子树。递归函数的定义如下:
- ,如果pRoot2待比较的节点为空说明子树中所有的节点已经进行了比较;
- ,如果pRoot2待比较的节点不为空,但是pRoot1待比较的节点已经为空,说明此时不存在这样的子结构;
- ,如果pRoot1和pRoot2待比较的节点都不为空,那么我们比较其值是否相等,不相等说明不存在这样的子结构;
- ,若值相等则分别递归比较(此时如果发现左子树结构不相等,则直接返回0,无需再比较右子树结构);
python代码:
class TreeNode:
def __init__(self, x):
self.val = x
self.left = None
self.right = None
class Solution:
def __init__(self):
self.ans = 0
def similar(self, pRoot1, pRoot2):
if not pRoot2:
return 1
elif not pRoot1:
return 0
elif pRoot1.val == pRoot2.val:
left = self.similar(pRoot1.left, pRoot2.left)
if left == 0:
return 0
right = self.similar(pRoot1.right, pRoot2.right)
return left and right
else:
return 0
def HasSubtree(self, pRoot1, pRoot2):
if not pRoot1 or not pRoot2:
return 0
self.ans |= self.similar(pRoot1, pRoot2)
if self.ans:
return 1
else:
self.ans |= self.HasSubtree(pRoot1.left, pRoot2)
self.ans |= self.HasSubtree(pRoot1.right, pRoot2)
pass
return self.ans