[LeetCode][LCR143]树的子结构判断——递归

题目

LCR 143. 子结构判断

给定两棵二叉树 tree1tree2,判断 tree2 是否以 tree1
的某个节点为根的子树具有相同的结构和节点值。注意,空树不会是以 tree1 的某个节点为根的子树具有相同的结构和节点值。

示例:
在这里插入图片描述

输入:tree1 = [1,7,5], tree2 = [6,1] 输出:false 
解释:tree2 与 tree1
的一个子树没有相同的结构和节点值。

在这里插入图片描述

输入:tree1 = [3,6,7,1,8], tree2 = [6,1] 输出:true 
解释:tree2 与 tree1
的一个子树拥有相同的结构和节点值。即 6 -> 1。

提示:

0 <= 节点个数 <= 10000

一种错误的解法

  • 根据观察,我意识到二叉树的先序遍历的序列可能是唯一的,那么如果 tree2 是 tree1 的子结构,其先序遍历序列应该就是 tree1 先序遍历序列的子序列,可以进行子序列的匹配,如果匹配上了就是子结构
  • 但实际上,子结构和子树并不是同一个概念,子结构相当于原来树的一部分,而子树是在相当于原来树的一部分的同时,其不能有其他子节点,只能有父结点
  • 比如下面这种输入,Tree2 确实是 Tree1 的一部分,但是不是其子树,两棵树的先序遍历结果并不匹配
Tree1:[10,12,6,8,3,11],先序遍历:[10,12,8,3,6,11]
Tree2:[10,12,6,8],先序遍历:[10,12,8,6]

在这里插入图片描述
在这里插入图片描述

  • 所以这种解法是错误的,在此贴上错误代码
/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode(int x) : val(x), left(NULL), right(NULL) {}* };*/
class Solution {vector<int> va, vb;
public://先序遍历void preorder_Traversal(TreeNode* root, vector<int>& v){if(!root) return;v.push_back(root->val);preorder_Traversal(root->left, v);preorder_Traversal(root->right, v);}bool isSubStructure(TreeNode* A, TreeNode* B) {if(!B) return false;//得到两棵树先序遍历的结果preorder_Traversal(A, va);preorder_Traversal(B, vb);if(vb.size()>va.size()) return false;//开始进行序列匹配for(int i=0; i<=va.size()-vb.size(); ++i){auto ita = va.begin()+i, itb=vb.begin();while(*ita==*itb){++ita;++itb;if(itb==vb.end()) return true;//B树匹配完成}}return false;}
};

正确解法:

思想

  1. 子结构可能与当前节点匹配,或者与当前节点的左子节点匹配,或者与当前节点的右子节点匹配
  2. 在匹配过程中,使用递归思想,不断匹配。如果匹配成功,则子结构被遍历到空节点;如果有节点不匹配,则匹配失败;如果直到 Tree1 都遍历完成还没匹配上,则也是匹配失败
/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode(int x) : val(x), left(NULL), right(NULL) {}* };*/
class Solution {
public:bool recur(TreeNode* A, TreeNode* B){if(!B) return true;//B树已经越过了叶子节点,匹配成功,返回(最终是否成功由B树的其他部分尝试匹配后确定)if(!A || A->val!=B->val) return false;//已经越过了A的叶子节点,或者A与B节点值不匹配,则匹配失败//本节点匹配相同,AB可能是从此节点开始匹配,则查看其左右子树是否匹配return recur(A->left, B->left) && recur(A->right, B->right);}bool isSubStructure(TreeNode* A, TreeNode* B) {//AB节点要都非空,并且B与A/A->left/A->right可能开始匹配(递归)return (A && B) && (recur(A, B) || isSubStructure(A->left, B) ||isSubStructure(A->right, B));}
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/733793.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

3.9Code

基于顺序存储结构的图书信息表的图书去重 #include<iostream> #include<stdlib.h> #include<string.h>typedef int status;#define OK 1using namespace std;typedef struct{char no[50];char name[50];float price; }Book;typedef struct{Book* elem;int …

【leetcode热题】LRU缓存机制

难度&#xff1a; 困难通过率&#xff1a; 23.0%题目链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 题目描述 运用你所掌握的数据结构&#xff0c;设计和实现一个 LRU (最近最少使用) 缓存机制。它应该支持以下操作&#xff1a; 获取数据 get 和 写入数据 put …

鸿蒙App动画、弹窗

动画 属性动画 https://developer.harmonyos.com/cn/docs/documentation/doc-references-V3/ts-animatorproperty-0000001478181445-V3 组件的某些通用属性变化时&#xff0c;可以通过属性动画实现渐变过渡效果&#xff0c;提升用户体验。支持的属性包括width、height、backg…

【软件工程】软件工程定义、软件危机以及软件生命周期

&#x1f338;博主主页&#xff1a;釉色清风&#x1f338;文章专栏&#xff1a;软件工程&#x1f338; 今日语录&#xff1a;What matters isn’t how others think of your ambitions but how fervently you cling to them. 软件工程系列&#xff0c;主要根据老师上课所讲提及…

【ubuntu】安装 Anaconda3

目录 一、Anaconda 说明 二、操作记录 2.1 下载安装包 2.1.1 官网下载 2.1.2 镜像下载 2.2 安装 2.2.1 安装必要的依赖包 2.2.2 正式安装 2.2.3 检测是否安装成功 方法一 方法二 方法三 2.3 其他 三、参考资料 3.1 安装资料 3.2 验证是否成功的资料 四、其他 …

基于机器学习的工业用电量预测完整代码数据

视频讲解: 毕业设计:算法+系统基于机器学习的工业用电量预测完整代码数据_哔哩哔哩_bilibili 界面展示: 结果分析与展示: 代码: from sklearn import preprocessing import random from sklearn.model_selection import train_test_split from sklearn.preprocessing…

tensorflow 的学习与应用

文章目录 一、tensorflow 是什么二、TensorFlow 基本概念详解三、如何学习 TensorFlow四、TensorFlow 的应用领域 一、tensorflow 是什么 TensorFlow是由Google Brain团队开发的功能强大的开源软件库&#xff0c;用于实现深度神经网络。它可以帮助简化神经网络的编写和部署过程…

vue element plus Typography 排版

我们对字体进行统一规范&#xff0c;力求在各个操作系统下都有最佳展示效果。 字体# 字号# LevelFont SizeDemoSupplementary text12px Extra SmallBuild with ElementBody (small)13px SmallBuild with ElementBody14px BaseBuild with ElementSmall Title16px MediumBuild w…

个人健康管理系统|基于微信小程序的个人健康管理系统设计与实现(源码+数据库+文档)

个人健康管理小程序目录 目录 基于微信小程序的个人健康管理系统设计与实现 一、前言 二、系统设计 三、系统功能设计 1、用户信息管理 2 运动教程管理 3、公告信息管理 4、论坛信息管理 四、数据库设计 1、实体ER图 五、核心代码 六、论文参考 七、最新计算机毕设…

Microsoft StudioCode:卓越的安全性保障

Microsoft StudioCode,即我们通常所说的Visual Studio Code(VS Code),是微软公司开发的一款免费、开源的代码编辑器。凭借其轻量级、跨平台、丰富的扩展生态等特点,VS Code迅速获得了广大开发者的青睐,成为了程序员必备的开发工具之一。而在安全性方面,VS Code同样表现出…

日期问题---算法精讲

前言 今天讲讲日期问题&#xff0c;所谓日期问题&#xff0c;在蓝桥杯中出现众多&#xff0c;但是解法比较固定。 一般有判断日期合法性&#xff0c;判断是否闰年&#xff0c;判断日期的特殊形式&#xff08;回文或abababab型等&#xff09; 目录 例题 题2 题三 总结 …

万字完整版【C语言】指针详解~

一、前言 初始指针&#xff08;0&#xff09;&#xff1a;着重于讲解指针的概念、基本用法、注意事项、以及最后如何规范使用指针深入指针&#xff08;1&#xff09;&#xff1a;讲解指针变量常见的类型&#xff0c;如何去理解这些类型、最后就是如何正确的使用深入指针&#…

【sgExcelGrid】自定义组件:简单模拟Excel表格拖拽、选中单元格、横行、纵列、拖拽圈选等操作

特性&#xff1a; 可以自定义拖拽过表格可以点击某个表格&#xff0c;拖拽右下角小正方形进行任意方向选取单元格支持选中某一行、列支持监听selectedGrids、selectedDatas事件获取选中项的DOM对象和数据数组支持props自定义显示label字段别名 sgExcelGrid源码 <template&g…

Swift 入门学习:集合(Collection)类型趣谈-下

概览 集合的概念在任何编程语言中都占有重要的位置&#xff0c;正所谓&#xff1a;“古来聚散地&#xff0c;宿昔长荆棘&#xff1b;游人聚散中&#xff0c;一片湖光里”。把那一片片、一瓣瓣、一粒粒“可耐”的小精灵全部收拢、吸纳的井然有序、条条有理&#xff0c;怎能不让…

React Three Fiber快速入门

https://threejs-journey.com/lessons/what-are-react-and-react-three-fiber#学习笔记 1.基础知识 resize 填充模版 构建第一个场景 we didn’t have to create a scenewe didn’t have to create the webglrenderthe scene is being rendered on each framethe default…

ubuntu23.10安装搜狗拼音

1.添加fcitx仓库 sudo add-apt-repository ppa:fcitx-team/nightly 更新: sudo apt-get update 安装fcitx sudo apt-get install fcitx fcitx安装成功 切换输入系统为fcitx

知识碎片收集

目录 1. 如何计算两点经纬度之间的距离2. 加权随机采样3.什么时LLDB和GDB 1. 如何计算两点经纬度之间的距离 1.知乎-如何计算两点经纬度间距离 2.根据两点经纬度坐标计算距离 3.根据经纬度计算两点之间的距离的公式推导过程以及google.maps的测距函数 4.根据经纬度点计算经…

『python爬虫』formhash 与 跨站请求伪造(CSRF)攻击

目录 1. 什么是跨站请求伪造&#xff08;CSRF&#xff09;攻击?2. 防御 CSRF 攻击的措施3. 在爬虫反爬中的具体应用 - formhash总结 欢迎关注 『python爬虫』 专栏&#xff0c;持续更新中 欢迎关注 『python爬虫』 专栏&#xff0c;持续更新中 1. 什么是跨站请求伪造&#xff…

rust引用-借用机制扩展

rust引用-借用机制还是有限制的&#xff0c;比如我们要在多次函数调用中修改参数、跨线程传递参数并发修改的场景&#xff0c;单纯使用引用-借用机制就不灵了&#xff08;这种场景和引用-借用功能是冲突的&#xff09;。这时需要借助rust提供的Rc、Arc、Cell、RefCell对机制来扩…

【C语言】tcp_transmit_skb

一、__tcp_transmit_skb讲解 这个函数 __tcp_transmit_skb() 是 Linux 内核中 TCP/IP 协议栈的一部分&#xff0c;负责处理传输控制协议&#xff08;TCP&#xff09;数据包的发送。具体来说&#xff0c;这个函数将 TCP 头部添加到一个没有任何头部信息的 socket buffer (sk_bu…