LeetCode 572. 另一个树的子树 | Python
572. 另一个树的子树
题目来源:https://leetcode-cn.com/problems/subtree-of-another-tree
题目
给定两个非空二叉树 s 和 t,检验 s 中是否包含和 t 具有相同结构和节点值的子树。s 的一个子树包括 s 的一个节点和这个节点的所有子孙。s 也可以看做它自身的一棵子树。
示例 1:
给定的树 s:
     3
    / \
   4   5
  / \
 1   2
给定的树 t:
   4
  / \
 1   2
返回 true,因为 t 与 s 的一个子树拥有相同的结构和节点值。
示例 2:
给定的树 s:
     3
    / \
   4   5
  / \
 1   2
    /
   0
给定的树 t:
   4
  / \
 1   2
返回 false。
解题思路
思路:深度优先搜索
在这里,先分析题意:
- 一个二叉树若为另一个树的子树,则它含有与另外一个树的子树相同结构和节点值。
 - 根据示例 2 可知,判断是否为子树,必须有完全相同结构和节点值。
 
以下 s、t 表示两个二叉树,题目要求判断 t 是否是 s 的子树
现在将题意转换为可实现代码书写的思路,判断两个树是否相等,那么下面的条件必须同时成立:
- 当前两个树根节点值相同;
 - s 的左子树与 t 的左子树相同;
 - s 的右子树与 t 的右子树相同。
 
根据上面的思路,本篇幅考虑使用深度优化搜索的方法,枚举 s 的每个节点,判断这个点的子树是否与 t 相等。使用深度优先搜索检查,从根出发,同步移动遍历两个树,判断相应的位置是否相等。
具体的代码实现如下。
代码实现
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def isSubtree(self, s: TreeNode, t: TreeNode) -> bool:
        return self.dfs(s, t)
    def dfs(self, c, t):
        # c 子树为空时,返回 False
        if not c:
            return False
        return self.is_same(c, t) or self.dfs(c.left, t) or self.dfs(c.right, t)
    def is_same(self, c, t):
        # 两个树都为空时,也认为是相同
        if (not c) and (not t):
            return True
        # 当其中一个树为空,但另外一个树不为空时,此时则为不同
        if (not c and t) or (c and not t):
            return False
        # 两个树都不为空,若值不同,也为不同
        if (c.val != t.val):
            return False
        # 上面的情况都不符合时,继续向下检查
        return self.is_same(c.left, t.left) and self.is_same(c.right, t.right)
实现结果

以上就是使用深度优先搜索,枚举 s 的每个节点与 t 进行匹配,进而解决《572. 另一个树的子树》问题的主要内容。
欢迎关注微信公众号《书所集录》
LeetCode 572. 另一个树的子树 | Python的更多相关文章
- LeetCode 572. 另一个树的子树(Subtree of Another Tree) 40
		
572. 另一个树的子树 572. Subtree of Another Tree 题目描述 给定两个非空二叉树 s 和 t,检验 s 中是否包含和 t 具有相同结构和节点值的子树.s 的一个子树包括 ...
 - [程序员代码面试指南]二叉树问题-判断t1树是否包含t2树的全部拓扑结构、[LeetCode]572. 另一个树的子树
		
题目1 解 先序遍历树1,判断树1以每个节点为根的子树是否包含树2的拓扑结构. 时间复杂度:O(M*N) 注意区分判断总体包含关系.和判断子树是否包含树2的函数. 代码 public class Ma ...
 - Java实现 LeetCode 572 另一个树的子树(遍历树)
		
572. 另一个树的子树 给定两个非空二叉树 s 和 t,检验 s 中是否包含和 t 具有相同结构和节点值的子树.s 的一个子树包括 s 的一个节点和这个节点的所有子孙.s 也可以看做它自身的一棵子树 ...
 - LeetCode 572. 另一个树的子树
		
题目链接:https://leetcode-cn.com/problems/subtree-of-another-tree/ 给定两个非空二叉树 s 和 t,检验 s 中是否包含和 t 具有相同结构和 ...
 - 力扣Leetcode 572. 另一个树的子树
		
另一个树的子树 给定两个非空二叉树 s 和 t,检验 s 中是否包含和 t 具有相同结构和节点值的子树.s 的一个子树包括 s 的一个节点和这个节点的所有子孙.s 也可以看做它自身的一棵子树. 示例 ...
 - 【LeetCode】572. 另一个树的子树 Subtree of Another Tree(Python & Java)
		
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 方法一:先序遍历 方法二:DFS + DFS 方法三 ...
 - [LeetCode] Subtree of Another Tree 另一个树的子树
		
Given two non-empty binary trees s and t, check whether tree t has exactly the same structure and no ...
 - LeetCode 572. Subtree of Another Tree (是否是另一个树的子树)
		
Given two non-empty binary trees s and t, check whether tree t has exactly the same structure and no ...
 - [Swift]LeetCode572. 另一个树的子树 | Subtree of Another Tree
		
Given two non-empty binary trees s and t, check whether tree t has exactly the same structure and no ...
 
随机推荐
- 十九种Elasticsearch字符串搜索方式终极介绍
			
前言 刚开始接触Elasticsearch的时候被Elasticsearch的搜索功能搞得晕头转向,每次想在Kibana里面查询某个字段的时候,查出来的结果经常不是自己想要的,然而又不知道问题出在了哪 ...
 - AJ整理问题之:copy,对象自定义copy 什么是property
			
AJ分享,必须精品 copy copy的正目的 copy 目的:建立一个副本,彼此修改,各不干扰 Copy(不可变)和MutableCopy(可变)针对Foundation框架的数据类型. 对于自定义 ...
 - shell脚本知识
			
1.提示符变量PS1 修改提示符变量:PS1="[u\@\h \t \w]" 修改环境变量设置文件bash_profile需要使用source或者.加上该文件使之生效 位置参数从1 ...
 - 从3dMax导出供threeJS使用的带动作模型与加载
			
评论区发现的建议,最近没空测试,先贴这 还有好多人说找不到插件的 https://pan.baidu.com/s/1Q5g0... 密码:b43e . 应该是他们现在只是维护blender,只有这个的 ...
 - Salesforce Admin考题解析 | 流程自动化考题与知识点拓展
			
[题目1] A record is modified on 1/1/2008. It meets criteria for a time-based workflow rule; this rule ...
 - L25词嵌入进阶GloVe模型
			
词嵌入进阶 在"Word2Vec的实现"一节中,我们在小规模数据集上训练了一个 Word2Vec 词嵌入模型,并通过词向量的余弦相似度搜索近义词.虽然 Word2Vec 已经能够成 ...
 - C. Standard Free2play --div
			
https://codeforces.com/contest/1238/problem/C 题意:下台阶的时候只有一种方式,拉动当前台阶x的 level,然后当前的台阶关闭,调到下边的台阶x-1,如果 ...
 - 详解 DatagramSocket类
			
(请观看本人博文 -- <详解 网络编程>) DatagramSocket 概述: 这类代表一个发送和接收数据包的插座. 该类是遵循 UDP协议 实现的一个Socket类. 数据报套接字发 ...
 - 本地同时使用多个git账号
			
config文件说明 Git Document指示在首次安装git的时候需要配置Config的相关内容信息,有三个地方存储了config文件,决定了读取的场景不同. 1 /etc/gitconfig: ...
 - AI-web-1靶机过关记录
			
靶机地址:172.16.1.195 Kali地址:172.16.1.107 1.信息收集 端口扫描: 目录扫描: 发现robots.txt敏感文件,查看 存在/m3diNf0/,/se3reTdir7 ...