【剑指offer】-树的子结构-17/67

简介: 【剑指offer】-树的子结构-17/67

1. 题目描述

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

2. 题目分析

两颗二叉树A和B,右边的树B是左边树A的子结构

  1. 要查找树A中是否存在和树B结构一样的子树,我们可以分为两步:
    a. 第一步,在树A种找到和树B的根节点的值一样的节点R
    b. 第二步,判断树A中以R为根节点的子树是不是包括和树B一样的结构。
  2. 以上面的两棵树来分析这个过程。首先试着在树A中找到值为8(树B的根节点的值)的节点。从树A的根节点开始遍历,我们发现树A的根节点就是8,。接着判断树A根节点的左子树和右子树是不是和树B的左子树和右子树一样。
  3. 此题中可知,根节点的左子树和右子树并不一样。仍需要遍历树A,接着继续查找值为8的节点。我们在树A的第二层找到了一个数值为8的节点,然后进行第二步的判断,既判断这个节点下面的子树是不是和树B一样的结构。

3. 题目代码

public class Solution {
    public static boolean HasSubtree(TreeNode root1, TreeNode root2) {
        boolean a = false;
        if(root1 != null && root2 != null){
            if(root1.val == root2.val){
                a = Tree(root1,root2);
            }
            if(!a){
                a = HasSubtree(root1.left,root2);
            }
            if(!a){
                a = HasSubtree(root1.right,root2);
            }
        }
        return a;
    }
    public static boolean Tree(TreeNode root1, TreeNode root2){
        if(root2 == null){
            return true;
        }
        if(root1 == null){
            return false;
        }
        if(root1.val != root2.val){
            return false;
        }
        return Tree(root1.left,root2.left) && Tree(root1.right,root2.right);
    }
}


相关文章
|
人工智能 小程序 前端开发
小程序源码| i麦当劳微信小程序源码模版
小程序源码| i麦当劳微信小程序源码模版
337 1
|
资源调度 小程序 前端开发
【微信小程序】-- npm包总结 --- 基础篇完结(四十七)
【微信小程序】-- npm包总结 --- 基础篇完结(四十七)
|
SQL 关系型数据库 MySQL
实时计算 Flink版产品使用问题之全量和增量同步数据的一致性、不丢失和不重复读取可以通过什么方式保证
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
图形学
【制作100个unity游戏之28】花半天时间用unity复刻童年4399经典小游戏《黄金矿工》(附带项目源码)
【制作100个unity游戏之28】花半天时间用unity复刻童年4399经典小游戏《黄金矿工》(附带项目源码)
558 0
|
存储 JSON 前端开发
需要token的原因----
需要token的原因----
403 0
|
Docker 容器
FunASR离线文件转写软件包3.0问题之Docker容器启动如何解决
FunASR离线文件转写软件包3.0问题之Docker容器启动如何解决
570 0
|
缓存 Java 测试技术
Java多线程实战-实现多线程文件下载,支持断点续传、日志记录等功能
Java多线程实战-实现多线程文件下载,支持断点续传、日志记录等功能
|
消息中间件 Linux Android开发
实战高效RPC方案在嵌入式环境中的应用与揭秘
该文介绍了在嵌入式环境中应用和设计高效RPC方案的过程。作者参考了Android的Binder机制,采用共享环形缓冲区来解决进程间同步返回值的问题。选择共享内存是因为其零拷贝、低延迟和灵活访问模式的优势,而环形缓冲区则提供了FIFO特性,便于数据有序传输并优化内存管理。文中提到了关键接口`write`和`read`的实现,以及一个简单的`CalculateSum`接口调用示例,展示了RPC方案的实际效果。该方案旨在提供一种轻量级、高性能的嵌入式RPC通信方法。
260 3
|
API 开发者
通过使用Phaser游戏框架,我成功地完成了“跳跃之旅”项目的开发
【5月更文挑战第14天】在Phaser框架下开发2D平台跳跃游戏"跳跃之旅"时,面临性能优化、碰撞检测与响应、图形和动画等挑战。通过使用Phaser的性能分析工具和资源优化策略提升帧率,利用内置物理引擎实现精确碰撞,编写自定义碰撞响应函数,以及借助图形绘制和动画系统创建精美动画,成功解决了这些问题。此过程提升了开发者的技术水平和对游戏开发的理解。
184 4
|
小程序 开发者
开发者社区数字藏品类奖品领取攻略
亲爱的用户,恭喜您在阿里云开发者社区活动中赢得数字藏品(NFT)奖品,本文为数字藏品类奖品领取攻略,请您仔细阅读,以便顺利领奖。
441 3

热门文章

最新文章