剑指Offer第17题-树的子结构

题目

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

思路

什么是二叉树的子结构及子树?

  • 子树的意思是包含了一个结点,就得包含这个结点下的所有节点,一棵大小为n的二叉树有n个子树,就是分别以每个结点为根的子树。
  • 子结构的意思是包含了一个结点,可以只取左子树或者右子树,或者都不取。

基本思想是递归
我们首先判断A, B是否为空,若有任何一个为空,则直接返回False。
然后判断A, B两个节点的值是否相同,如果不相同,就可以直接返回False。
如果相同,再判断A的左子树和B的左子树,A的右子树和B的右子树是否有相同的值,若B没有对应的子树就可以直接返回True。

代码

# -*- coding:utf-8 -*-
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None
class Solution:
    def is_subtree(self, pRoot1, pRoot2):
        if not pRoot2: return True
        if not pRoot1: return False
        if pRoot1.val == pRoot2.val:
            return self.is_subtree(pRoot1.left, pRoot2.left) and \
                   self.is_subtree(pRoot1.right, pRoot2.right)
        else: return False
    def HasSubtree(self, pRoot1, pRoot2):
        # write code here
        if (not pRoot1) or (not pRoot2): return False
        return self.is_subtree(pRoot1, pRoot2) or \
               self.HasSubtree(pRoot1.left, pRoot2) or \
               self.HasSubtree(pRoot1.right, pRoot2)

代码翻译自牛客网某大牛的C++代码
用到了 短路特性 这一技巧

  • 逻辑运算符的短路特性(以java为例)
  1. &&的短路特性: 因为程序从左往右执行的,当判断左边为false时&&的返回结果就已经注定是false , 所以后面的判断计算机就不执行了
  2. || 的短路特性:因为程序是从左往右执行,当判断左边为true时 返回结果就已经注定是 true, 所以后面的判断计算机不执行

参考

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • B树的定义 一棵m阶的B树满足下列条件: 树中每个结点至多有m个孩子。 除根结点和叶子结点外,其它每个结点至少有m...
    文档随手记阅读 13,479评论 0 25
  • 数据结构与算法--从平衡二叉树(AVL)到红黑树 上节学习了二叉查找树。算法的性能取决于树的形状,而树的形状取决于...
    sunhaiyu阅读 7,710评论 4 32
  • 一. 算法之变,结构为宗 计算机在很多情况下被应用于检索数据,比如航空和铁路运输业的航班信息和列车时刻表的查询,都...
    Leesper阅读 7,114评论 13 42
  • 数据结构和算法--二叉树的实现 几种二叉树 1、二叉树 和普通的树相比,二叉树有如下特点: 每个结点最多只有两棵子...
    sunhaiyu阅读 6,590评论 0 14
  • 第九章 错娶一个人是要赔上命的(中) 轿车飞快的行驶在高速公路上。我们要返回山东,新的一周开始了,还有很多事需要...
    过儿爱菇菇阅读 301评论 0 1