LeetCode 0572.另一棵树的子树:深搜+广搜(n^2做法就能过,也有复杂度耕地的算法)

devtools/2024/10/19 9:34:46/

【LetMeFly】572.另一棵树的子树:深搜+广搜(n^2做法就能过,也有复杂度耕地的算法

力扣题目链接:https://leetcode.cn/problems/subtree-of-another-tree/

给你两棵二叉树 rootsubRoot 。检验 root 中是否包含和 subRoot 具有相同结构和节点值的子树。如果存在,返回 true ;否则,返回 false

二叉树 tree 的一棵子树包括 tree 的某个节点和这个节点的所有后代节点。tree 也可以看做它自身的一棵子树。

 

示例 1:

leetcode.com%2Fuploads%2F2021%2F04%2F28%2Fsubtree1-tree.jpg&pos_id=img-NwWwQRoc-1722869538024%29" />
输入:root = [3,4,5,1,2], subRoot = [4,1,2]
输出:true

示例 2:

leetcode.com%2Fuploads%2F2021%2F04%2F28%2Fsubtree2-tree.jpg&pos_id=img-BUdtugC2-1722869543533%29" />
输入:root = [3,4,5,1,2,null,null,null,null,0], subRoot = [4,1,2]
输出:false

 

提示:

  • root 树上的节点数量范围是 [1, 2000]
  • subRoot 树上的节点数量范围是 [1, 1000]
  • -104 <= root.val <= 104
  • -104 <= subRoot.val <= 104

解题方法:深搜+广搜(硬匹配)

如何判断两个树是否相同呢?

我们可以写一个函数isSame(rootA, rootB)来判断以rootA为根的树是否和以rootB为根的树相同。

首先如果rootA和rootB中有一个为空,那么他们都要为空才能相等;

否则(都不为空),rootA的值必须和rootB的值相等,并且他们的左子树相等(可递归判断),右子树也相等,两棵树才能相同。

因此,我们可以遍历以root为根的这棵树的每一个节点(深搜和广搜都可,本题解中C++代码以广搜为例,Python代码以深搜为例),判断以每个节点为根的树是否和以subRoot为根的树相同。一旦存在相同的子树,则立即返回true。

  • 时间复杂度 O ( s i z e ( r o o t ) × s i z e ( s u b R o o t ) ) O(size(root)\times size(subRoot)) O(size(root)×size(subRoot))
  • 空间复杂度 O ( s i z e ( r o o t ) ) O(size(root)) O(size(root))

AC代码

C++
class Solution {
private:bool isSame(TreeNode* a, TreeNode* b) {if (!a || !b) {return a == b;}return a->val == b->val && isSame(a->left, b->left) && isSame(a->right, b->right);}
public:bool isSubtree(TreeNode* root, TreeNode* subRoot) {queue<TreeNode*> q;q.push(root);while (q.size()) {TreeNode* thisNode = q.front();q.pop();if (isSame(thisNode, subRoot)) {return true;}if (thisNode->left) {q.push(thisNode->left);}if (thisNode->right) {q.push(thisNode->right);}}return false;}
};
Python
# from typing import Optional
# # 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 = rightclass Solution:def isSame(self, a: Optional[TreeNode], b: Optional[TreeNode]) -> bool:if not a or not b:return a == breturn a.val == b.val and self.isSame(a.left, b.left) and self.isSame(a.right, b.right)def isSubtree(self, root: Optional[TreeNode], subRoot: Optional[TreeNode]) -> bool:if not root:return Falseif self.isSame(root, subRoot):return Truereturn self.isSubtree(root.left, subRoot) or self.isSubtree(root.right, subRoot)

解题方法拓展

假设两棵树的节点个数分别为m和n。

上述解题方法中,如果二叉树退化成链,且树中元素几乎全为1,则要比较接近 m n mn mn次。

有没有什么能提升效率的方法呢?其实我们在深搜以root为根的树的时候可以统计一下每个节点距其子树最远叶子节点的距离,只有高度相同的树才有可能相同。这样,每个节点不会被比较多次,我们就将时间复杂度降低到了 O ( m ) O(m) O(m)。(如果 n > m n\gt m n>m则不会比完全以subRoot为根节点的树的节点)

同步发文于CSDN和我的个人博客,原创不易,转载经作者同意后请附上原文链接哦~

Tisfy:https://letmefly.blog.csdn.net/article/details/140939018


http://www.ppmy.cn/devtools/90887.html

相关文章

Linux修炼之路之进程地址空间

目录 一&#xff1a;程序地址空间 二&#xff1a;相关细节知识 接下来的日子会顺顺利利&#xff0c;万事胜意&#xff0c;生活明朗-----------林辞忧 一&#xff1a;程序地址空间 1.在学习c/c时&#xff0c;经常会听到堆区&#xff0c;栈区&#xff0c;代码段&#xff0c;常量…

6种创造型设计模式

创造型设计模式 工厂模式简单工厂模式工厂方法模式抽象工厂模式 单例模式懒汉模式饿汉模式静态内部类 原型模式建造者模式PS 工厂模式 工厂模式是为了更好管理new出来的对象, 把创建对象的任务交给工厂做, 比手动new更符合软件设计原则 简单工厂模式 包括三个角色 工厂角色…

Matplotlib | 绘制折线图

目录 简介安装 Matplotlib开始绘制简单折线图改变线的样式改变节点的样式添加图表文字改变坐标轴标签改变坐标数值范围绘制多条折线实践&#xff1a;绘制温度变化图 简介 折线图&#xff08;Line Chart&#xff09;&#xff0c;是一种以折线来呈现数据随时间变化而变化的图表。…

数据结构——排序(1):插入排序

目录 一、排序的概念 二、排列的运用 三、常见的排序算法 四、插入排序 1.直接插入排序 &#xff08;1&#xff09;思路 &#xff08;2&#xff09;过程图示 &#xff08;3&#xff09;代码实现 (4)代码解释 &#xff08;5&#xff09;特性 2.希尔排序 &#xff08;1…

获取客户端真实IP

出于安全考虑&#xff0c;近期在处理一个记录用户真实IP的需求。本来以为很简单&#xff0c;后来发现没有本来以为的简单。这里主要备忘下&#xff0c;如果服务器处于端口回流&#xff08;hairpin NAT&#xff09;,keepalived&#xff0c;nginx之后&#xff0c;如何取得客户端的…

【C++】模拟实现list

&#x1f984;个人主页:修修修也 &#x1f38f;所属专栏:实战项目集 ⚙️操作环境:Visual Studio 2022 目录 一.了解项目及其功能 &#x1f4cc;了解list官方标准 了解模拟实现list &#x1f4cc;了解更底层的list实现 二.list迭代器和vector迭代器的异同 &#x1f4cc;迭…

vulnhub靶机实战_DC-8

一、靶机下载 靶机下载链接汇总&#xff1a;https://download.vulnhub.com/使用搜索功能&#xff0c;搜索dc类型的靶机即可。本次实战使用的靶机是&#xff1a;DC-8系统&#xff1a;Debian下载链接&#xff1a;https://download.vulnhub.com/dc/DC-8.zip 二、靶机启动 下载完…

C++第三十二弹---从概念到实践:全面解析C++多态性

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】 目录 1. 多态的概念 1.1 概念 2. 多态的定义及实现 2.1 多态的构成条件 2.2 虚函数 2.3 虚函数的重写 2.4 C11 override 和 final 2.5 重载、覆…