《苦练算法》-剑指Offer- 十七、树的子结构 -python编写
2018-02-05 09:55
197 查看
题目描述
输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
题目分析
判断B是否为A的子结构 注意ps这个肯定为某个先级条件
1.先考虑 A为null 和B为null的时候,此时都应该返回False
2.继而判断A的此时的节点和B的此时的节点 是否为子结构的相同的根节点,进行相应的子树判断。
3.因为题目只问你有没有子树而已,所以只需要判断是否存在即可,所以需要或上A的左子树是否存在B的子树,A的右子树是否存在B的子树
4.判断是否为子树的分析: 如果root2为None说明root2遍历结束,全部能和root1匹配上说明匹配成功返回True,如果root1为None说明root1遍历结束时,root2还没结束,说明不匹配返回False,上述都不满足说明还需要判断是否匹配,如果此时的这对根节点的值相等则进行递归判断,这对根节点的左节点和右节点是否能全部匹配。
代码如下:
输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
题目分析
判断B是否为A的子结构 注意ps这个肯定为某个先级条件
1.先考虑 A为null 和B为null的时候,此时都应该返回False
2.继而判断A的此时的节点和B的此时的节点 是否为子结构的相同的根节点,进行相应的子树判断。
3.因为题目只问你有没有子树而已,所以只需要判断是否存在即可,所以需要或上A的左子树是否存在B的子树,A的右子树是否存在B的子树
4.判断是否为子树的分析: 如果root2为None说明root2遍历结束,全部能和root1匹配上说明匹配成功返回True,如果root1为None说明root1遍历结束时,root2还没结束,说明不匹配返回False,上述都不满足说明还需要判断是否匹配,如果此时的这对根节点的值相等则进行递归判断,这对根节点的左节点和右节点是否能全部匹配。
代码如下:
# -*- coding:utf-8 -*- # class TreeNode: # def __init__(self, x): # self.val = x # self.left = None # self.right = None class Solution: #判断 单个root的子树的程序 def isSubtree(self, root1, root2): #如果2遍历完说明 匹配成功 if root2 == None: return True #如果1便利完说明,2还没便利完,匹配不成功 if root1 == None: return False #如果这对根节点的值相等,进行相应的递归遍历这对节点的 左右节点是否匹配 if root1.val == root2.val: return self.isSubtree(root1.left,root2.left) and self.isSubtree(root1.right,root2.right) #总程序 def HasSubtree(self, pRoot1, pRoot2): # write code here #特殊情况 需判断 if pRoot1 == None or pRoot2 == None: return False #进行递归判断和遍历,判断1此时是否有2的子树,或1的左子树中是否存在与2相同的的子树,或1的右子树是否存在与2相同的子树 return self.isSubtree(pRoot1,pRoot2) or self.HasSubtree(pRoot1.left,pRoot2) or self.HasSubtree(pRoot1.right,pRoot2)
相关文章推荐
- 《苦练算法》-剑指Offer- 二十七、字符串的排序-python编写
- 《苦练算法》-剑指Offer- 六、 旋转数组的最小数字 -python编写
- 《苦练算法》-剑指Offer- 十三、 调整数组顺序使奇数位于偶数前面 -python编写
- 《苦练算法》-剑指Offer- 三十、最小的k个数-python编写
- 《苦练算法》-剑指Offer- 四、 重建二叉树 -python编写
- 《苦练算法》-剑指Offer- 五、 用两个栈实现队列 -python编写
- 《苦练算法》-剑指Offer- 二、 替换空格 -python编写
- 《苦练算法》-剑指Offer- 十二、 整值的整数次幂 -python编写
- 《苦练算法》-剑指Offer- 十九、顺时针打印矩阵 -python编写
- 《苦练算法》-剑指Offer- 二十一、栈的压入、弹出序列 -python编写
- 《苦练算法》-剑指Offer- 二十四、二叉树中和为某一值得路径 -python编写
- 《苦练算法》-剑指Offer- 九、 变态跳台阶 -python编写
- 《苦练算法》-剑指Offer- 十、 矩形覆盖 -python编写
- 《苦练算法》-剑指Offer- 十五、 反转链表 -python编写
- 《苦练算法》-剑指Offer- 二十二、从上往下打印二叉树 -python编写
- 《苦练算法》-剑指Offer- 三十二、把数组排成最小的数-python编写
- 《苦练算法》-剑指Offer- 一、 二维数组中的查找 -python编写
- 《苦练算法》-剑指Offer- 三十一、从1到n整数中1出现的次数-python编写
- 《苦练算法》-剑指Offer- 八、 跳台阶 -python编写
- 《苦练算法》-剑指Offer- 三、 从尾到头打印链表 -python编写