博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
(python版)《剑指Offer》JZ17:树的子结构
阅读量:4090 次
发布时间:2019-05-25

本文共 1902 字,大约阅读时间需要 6 分钟。

本系列文章为《剑指Offer》刷题笔记。

刷题平台:

在这里插入图片描述
这类题目与字符串匹配有些神似,求解过程大致分为两步:

  • 先将根节点匹配
  • 根节点匹配后,对子树进行匹配

在这里插入图片描述

最终代码如下:
在这里插入图片描述

代码中主要涉及 主函数checkSubTreedfs 函数 两个部分。与以上思路对应,主函数对应根节点的匹配,dfs 函数对应匹配其他节点。

1.dfs 函数

dfs 函数将注意力集中在了根节点已经匹配的情况。当从根节点同时开始向下遍历时,我们进行以下判断:

  • 如果 A 和 B 同时遍历到了 null,说明匹配成功,返回 True(case 1 红色虚线框);
  • 如果 A 或 B 提前遍历到了 null,一棵树匹配完了,另一棵却没有,说明子树的结构是不同的,则匹配失败,返回 False(case 2 红色虚线框)。

在这里插入图片描述

以上是“基本情况”,在到达基本情况之前,我们需要判断根节点的值、左子树(调用递归)和右子树(调用递归)是否匹配。

于是就有了代码中的 dfs 函数形式:

在这里插入图片描述

2.主函数checkSubTree

现在将视野放远来看,主函数则解决了如何确定 A 的哪个节点是 B 的根节点。

如果 A 的当前节点值与 B 的根节点值相同,我们调用 dfs 函数判断子树是否也相同;如果不同,我们就递归调用主函数来寻找 A 的哪个节点与 B 的根节点匹配。

所以,主函数会写成这样:

在这里插入图片描述
【本题解法】
对于本题来讲,与前面的例题很像,不同的是 B 属于 A 的一部分也可以,没必要一直匹配到叶子节点。因此只需对 check 函树的基本条件进行修改即可。

< Leetcode >

class Solution:    def check(self, s, t): # 这里 t 可能为空        if not t:            return True        if not s:            return False                return s.val == t.val and self.check(s.left, t.left) and self.check(s.right, t.right)    def isSubStructure(self, A: TreeNode, B: TreeNode) -> bool:        if not A or not B: return False        return self.check(A, B) or self.isSubStructure(A.left, B) or self.isSubStructure(A.right, B)

链接:https://leetcode-cn.com/problems/shu-de-zi-jie-gou-lcof/solution/pi-pei-lei-er-cha-shu-ti-mu-zong-jie-by-z1m/

< 牛客 >

# -*- coding:utf-8 -*-# class TreeNode:#     def __init__(self, x):#         self.val = x#         self.left = None#         self.right = Noneclass Solution:    def HasSubtree(self, pRoot1, pRoot2):        if not pRoot1 or not pRoot2:            return False        return self.isSubStructure(pRoot1, pRoot2) or self.HasSubtree(pRoot1.left, pRoot2) or self.HasSubtree(pRoot1.right, pRoot2)            def isSubStructure(self, A, B):        if not B:            return True        if not A:            return False        return A.val == B.val and self.isSubStructure(A.left, B.left) and self.isSubStructure(A.right, B.right)

https://www.cnblogs.com/ansang/p/11938132.html

你可能感兴趣的文章
前端常见经典布局一:粘连布局
查看>>
CommonJS Browserify模块化教程
查看>>
AMD:RequireJS模块化教程
查看>>
CMD:SeaJS模块化教程
查看>>
ES6模块化教程
查看>>
前端模块化知识汇总
查看>>
mockjs使用指南
查看>>
移动端如何实现头部底部固定,中间区域自适应
查看>>
前端面试必知:session 与 cookie那些事
查看>>
vue-cli 脚手架安装 scss 的具体步骤
查看>>
使用 vue-cli 脚手架搭建项目,如何设置 scss 全局样式
查看>>
解决 vue 项目在 ie 下打开一片空白的问题
查看>>
vue-cli 4.x 中使用 sass 的一些坑
查看>>
什么是前端工程化
查看>>
element ui el-row el-col里面高度不一致的问题
查看>>
微信小程序关联公众号:official-account组件的使用
查看>>
picker组件如何可以像input一样有个placeholder的提示内容?
查看>>
小程序实现列表无限滚动加载的详细步骤
查看>>
小程序使用echarts封装成自定义组件的实现方法
查看>>
微信小程序如何在父组件中修改子组件的样式
查看>>