剑指offer——JZ26 树的子结构 解题思路与具体代码【C++】

一、题目描述与要求

树的子结构_牛客题霸_牛客网 (nowcoder.com)

题目描述

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

假如给定A为{8,8,7,9,2,#,#,#,#,4,7},B为{8,9,2},2个树的结构如下,可以看出B是A的子结构

数据范围:

0 <= A的节点个数 <= 10000

0 <= B的节点个数 <= 10000

示例

示例1:

输入:{8,8,7,9,2,#,#,#,#,4,7},{8,9,2}

返回值:true

示例2:

输入:{1,2,3,4,5},{2,4}

返回值:true

示例3:

输入:{1,2,3},{3,1}

返回值:false


二、解题思路

根据题目描述,我们需要判断B树是否为A树的子树。

首先题目规定了“空树不是任意一个树的子结构”,所以我们先判断B树是否为空树,是的话直接返回false;

然后如果A是空树且B不是空树的话,那么B肯定不是A的子树,也返回false;

但是如果A和B都为空或者A不为空B为空的情况下,则B就是A的子树,返回true;(这里的空,可应该解释为空节点)

若A树B树都不为空,则我们就需要对两个树进行遍历,然后比较,我们想要判断B树是否为A树的子树,那就需要从根结点开始,以每个结点为“根结点”然后跟B树进行比较。【这是因为B树不一定是从A的根结点开始的,所以在当前结点不符合的情况下,我们依次将左节点与右节点作为“根结点”与B树进行比较】

如果根结点的值相同,则去判断左子树与右子树是否相同,都相同就代表B是A的子树,只要有不同则就需要我们继续往下找,也就是换一个结点为“根结点”,然后与B树继续比较。

直至找到与B树相同的结点或者A树遍历结束。

最后对所设置的三个标志进行判断。flag1是指以根结点开始与B树比较的结果,flag2是指以左子树的结点为开始与B树比较的结果,flag3是指以右子树的结点为开始与B树比较的结果。三者只需要有一个为真就代表B树是A的子树。【每个比较都是递归的,都是以当前节点为根结点,以此去访问左子树与右子树】


三、具体代码

class Solution {
public:bool recursion(TreeNode* pRoot1,TreeNode* pRoot2){//当一个节点存在另一个不存在时if(pRoot1==nullptr&&pRoot2!=nullptr) return false;//两个都为空则返回trueif(pRoot1==nullptr||pRoot2==nullptr) return true;//比较节点值if(pRoot1->val!=pRoot2->val) return false;//递归比较子树return recursion(pRoot1->left,pRoot2->left) && recursion(pRoot1->right,pRoot2->right);}bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2) {//B为空树if(pRoot2==nullptr)  return false;//A为空,B不为空if(pRoot1==nullptr&&pRoot2!=nullptr) return false;//A不为空B为空 A,B都为空 if(pRoot1==nullptr||pRoot2==nullptr) return true;//把当前根结点的二叉树与B树进行递归比较bool flag1=recursion(pRoot1,pRoot2);//递归A树的每个结点 分别以每个结点为根结点进行比较bool flag2=HasSubtree(pRoot1->left,pRoot2);bool flag3=HasSubtree(pRoot1->right, pRoot2);return flag1||flag2||flag3;}
};

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

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

相关文章

生产设备巡检管理系统

凡尔码搭建生产设备巡检系统是通过确保巡检工作的质量以及提高巡检工作的效率来提高设备维护水平的一种系统&#xff0c;它对巡检管理考核工作从巡检人员、巡检任务、隐患管理、图像视频、盯防考核进行严格、科学的统计、分析&#xff0c;从而有效的保障巡检工作的顺利展开&…

超声波气象站——环境监测领域强大助手

超声波气象站是环境监测领域的一位强大助手&#xff0c;超声波气象站是一种综合型的气象设备&#xff0c;精巧而全面&#xff0c;满足人们对环境状况的深入了解和精准把握。 首先&#xff0c;超声波气象站的传感器部分&#xff0c;是它的核心组成部分&#xff0c;这位“感知者”…

【数据结构】排序(3)—堆排序归并排序

目录 一. 堆排序 基本思想 代码实现 向上调整算法 向下调整算法 时间和空间复杂度 稳定性 二. 归并排序 基本思想 代码实现 时间和空间复杂度 稳定性 一. 堆排序 堆排序&#xff08;Heapsort&#xff09;是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似 …

蓝桥等考Python组别十四级002

第一部分&#xff1a;选择题 1、Python L14 &#xff08;15分&#xff09; 运行下面程序&#xff0c;输出的结果是&#xff08; &#xff09;。 d {A: 11, B: 12, C: 13, D: 14} print(d[B]) 11121314 正确答案&#xff1a;B 2、Python L14 &#xff08;15分&#x…

JMeter性能测试

性能测试前言 老师开局一句话&#xff1a;性能测试和你会不会JMeter一点关系没有…… 作者坚持技多不压身的原则&#xff0c;还是多学一点JMeter吧&#xff0c;看老师到底要怎么讲下去&#xff0c;什么并发量、吞吐量啥的…… 性能测试的核心思想&#xff1a;在于创造大量并发去…

(32)测距仪(声纳、激光雷达、深度摄影机)

文章目录 前言 32.1 单向测距仪 32.2 全向性近距离测距仪 32.3 基于视觉的传感器 前言 旋翼飞机/固定翼/无人车支持多种不同的测距仪&#xff0c;包括激光雷达&#xff08;使用激光或红外线光束进行距离测量&#xff09;、360 度激光雷达&#xff08;可探测多个方向的障碍…

【C++】:类和对象(2)

朋友们、伙计们&#xff0c;我们又见面了&#xff0c;本期来给大家解读一下有关Linux的基础知识点&#xff0c;如果看完之后对你有一定的启发&#xff0c;那么请留下你的三连&#xff0c;祝大家心想事成&#xff01; C 语 言 专 栏&#xff1a;C语言&#xff1a;从入门到精通 数…

透明度和透明贴图制作玻璃水杯

1、什么是透明度 模型透明度是指一个物体或模型在呈现时的透明程度。它决定了物体在渲染时&#xff0c;是否显示其后面的物体或背景。 在图形渲染中&#xff0c;透明度通常以0到1之间的值表示。值为0表示完全透明&#xff0c;即物体不可见&#xff0c;背景或其他物体完全穿透…

Python之元组

Python之元组 元组tuple 一个有序的元素组成的集合使用小括号 ( ) 表示元组是不可变对象 tuple(), (), type(()) # 空元组 ((), (), tuple)(1,), (1) # 元组中只有1必须加逗号&#xff0c;否则就是1了 # ((1,), 1)x 1, 2 # 以逗号分隔的内容会形成元组&#xff0c;封装元组x…

JVM-满老师

JVM 前言程序计数器&#xff0c;栈&#xff0c;虚拟机栈&#xff1a;本地方法栈&#xff1a;堆&#xff0c;方法区&#xff1a;堆内存溢出方法区运行时常量池 垃圾回收垃圾回收算法分代回收 前言 JVM 可以理解的代码就叫做字节码&#xff08;即扩展名为 .class 的文件&#xff…

目标检测算法改进系列之Backbone替换为RIFormer

RIFormer简介 Token Mixer是ViT骨干非常重要的组成成分&#xff0c;它用于对不同空域位置信息进行自适应聚合&#xff0c;但常规的自注意力往往存在高计算复杂度与高延迟问题。而直接移除Token Mixer又会导致不完备的结构先验&#xff0c;进而导致严重的性能下降。 原文地址&…

【JavaEE】JUC(Java.util.concurrent)常见类

文章目录 前言ReentrantLock原子类线程池信号量CountDownLatch相关面试题 前言 经过前面文章的学习我们大致了解了如何实现多线程编程和解决多线程编程中遇到的线程不安全问题&#xff0c;java.util.concurrent 是我们多线程编程的一个常用包&#xff0c;那么今天我将为大家分…