美文网首页
剑指Offer第17题-树的子结构

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

作者: Joseph_Chu | 来源:发表于2018-05-21 18:15 被阅读0次

    题目

    输入两棵二叉树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, 所以后面的判断计算机不执行

    参考

    相关文章

      网友评论

          本文标题:剑指Offer第17题-树的子结构

          本文链接:https://www.haomeiwen.com/subject/udsqjftx.html