面试题26:树的子结构

题目描述

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

知识点

二叉树


Qiang的思路

这道题主要考虑的是二叉树的遍历。典型的,我们可以通过递归的方式实现二叉树的遍历。

想要判断B是不是A的子结构,自然需要对A和B进行遍历。首先,需要找到遍历的起始点,通过遍历树A,我们能找到在A中和B的根节点相同的节点。然后对于这些节点,同时遍历A和B,看一下是不是以该节点开头的子树的一部分和B相同,如果相同则证明B就是A的子结构,如果所有节点都不满足条件,那就说明B不是A的子结构。

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

在编写代码的过程中,需要注意的一点就是判断是不是子结构的终止条件。因为当B是子结构时,并不意味这他就是子树,所以当遍历到B的叶子节点时就认为当前所判断的均满足子结构的条件,并不需要A和B同时满足子节点。


作者原创,如需转载及其他问题请邮箱联系:lwqiang_chn@163.com
个人网站:https://www.myqiang.top

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

推荐阅读更多精彩内容

  • 专业考题类型管理运行工作负责人一般作业考题内容选项A选项B选项C选项D选项E选项F正确答案 变电单选GYSZ本规程...
    小白兔去钓鱼阅读 9,055评论 0 13
  • 题目描述 牛客网 输入两颗二叉树 A 和 B,判断 B 是不是 A 的子结构 题目解读 剑指Offer 149 代...
    cb_guo阅读 150评论 0 0
  • 树的概述 树是一种非常常用的数据结构,树与前面介绍的线性表,栈,队列等线性结构不同,树是一种非线性结构 1.树的定...
    Jack921阅读 4,489评论 1 31
  • 该题的思路应该使用递归来判断,通过判断左子树和右子树来判断树是否是子结构,当子结构为空时,则判断成功
    灰化肥发黑会挥发阅读 193评论 0 0
  • 老师看书时,非常认真,认真到了别人跟他说话他都不理别人,仿佛进入到了书的世界里。 老师拿着自己一本喜爱的书籍,会让...