二叉树题目:叶子相似的树

news2024/12/23 17:20:45

文章目录

  • 题目
    • 标题和出处
    • 难度
    • 题目描述
      • 要求
      • 示例
      • 数据范围
  • 解法一
    • 思路和算法
    • 代码
    • 复杂度分析
  • 解法二
    • 思路和算法
    • 代码
    • 复杂度分析

题目

标题和出处

标题:叶子相似的树

出处:872. 叶子相似的树

难度

3 级

题目描述

要求

考虑一个二叉树上所有的叶子,这些叶子的值按从左到右的顺序排列形成一个叶值序列

示例

例如,上图给定的树的叶值序列为 (6,   7,   4,   9,   8) \texttt{(6, 7, 4, 9, 8)} (6, 7, 4, 9, 8)

如果有两个二叉树的叶值序列相同,那么它们是叶相似的。

当且仅当给定的两个根结点分别为 root1 \texttt{root1} root1 root2 \texttt{root2} root2 的树是叶相似的情况下,返回 true \texttt{true} true

示例

示例 1:

示例 1

输入: root1   =   [3,5,1,6,2,9,8,null,null,7,4],   root2   =   [3,5,1,6,7,4,2,null,null,null,null,null,null,9,8] \texttt{root1 = [3,5,1,6,2,9,8,null,null,7,4], root2 = [3,5,1,6,7,4,2,null,null,null,null,null,null,9,8]} root1 = [3,5,1,6,2,9,8,null,null,7,4], root2 = [3,5,1,6,7,4,2,null,null,null,null,null,null,9,8]
输出: true \texttt{true} true

示例 2:

示例 2

输入: root1   =   [1,2,3],   root2   =   [1,3,2] \texttt{root1 = [1,2,3], root2 = [1,3,2]} root1 = [1,2,3], root2 = [1,3,2]
输出: false \texttt{false} false

数据范围

  • 每个树中结点数目在范围 [1,   200] \texttt{[1, 200]} [1, 200]
  • 每个树中结点值在范围 [0,   200] \texttt{[0, 200]} [0, 200]

解法一

思路和算法

二叉树的叶值序列为所有叶结点值按照从左到右的顺序组成的序列。规定深度优先搜索的顺序为先遍历左子树再遍历右子树,则二叉树的叶值序列即为深度优先搜索遍历所有叶结点的顺序。

对于每个二叉树,从根结点开始深度优先搜索,访问根结点之后依次遍历左子树和右子树,并对左子树和右子树递归地遍历,访问到叶结点时将叶结点值加到叶值序列,遍历结束时即可得到二叉树的叶值序列。

两个二叉树都遍历结束之后,比较两个二叉树的叶值序列是否相等即可。

代码

class Solution {
    public boolean leafSimilar(TreeNode root1, TreeNode root2) {
        List<Integer> sequence1 = new ArrayList<Integer>();
        List<Integer> sequence2 = new ArrayList<Integer>();
        getLeafValueSequence(root1, sequence1);
        getLeafValueSequence(root2, sequence2);
        return sequence1.equals(sequence2);
    }

    public void getLeafValueSequence(TreeNode node, List<Integer> sequence) {
        if (node.left == null && node.right == null) {
            sequence.add(node.val);
        } else {
            if (node.left != null) {
                getLeafValueSequence(node.left, sequence);
            }
            if (node.right != null) {
                getLeafValueSequence(node.right, sequence);
            }
        }
    }
}

复杂度分析

  • 时间复杂度: O ( m + n ) O(m + n) O(m+n),其中 m m m n n n 分别是两个二叉树的结点数。对两个二叉树深度优先搜索,每个结点都被访问一次。

  • 空间复杂度: O ( m + n ) O(m + n) O(m+n),其中 m m m n n n 分别是两个二叉树的结点数。空间复杂度主要是递归调用的栈空间和两个二叉树的叶值序列空间。

解法二

思路和算法

也可以使用迭代实现深度优先搜索,需要使用栈存储结点。

从根结点开始遍历。每次访问一个结点之后,将当前结点入栈然后将当前结点移动到其左子结点,直到当前结点为空。然后将一个结点出栈,将当前结点设为出栈结点的右子结点。当所有结点都访问过时,遍历结束。

遍历过程中,访问到叶结点时将叶结点值加到叶值序列。两个二叉树都遍历结束之后,比较两个二叉树的叶值序列是否相等即可。

代码

class Solution {
    public boolean leafSimilar(TreeNode root1, TreeNode root2) {
        List<Integer> sequence1 = getLeafValueSequence(root1);
        List<Integer> sequence2 = getLeafValueSequence(root2);
        return sequence1.equals(sequence2);
    }

    public List<Integer> getLeafValueSequence(TreeNode root) {
        List<Integer> sequence = new ArrayList<Integer>();
        Deque<TreeNode> stack = new ArrayDeque<TreeNode>();
        TreeNode node = root;
        while (!stack.isEmpty() || node != null) {
            while (node != null) {
                if (node.left == null && node.right == null) {
                    sequence.add(node.val);
                }
                stack.push(node);
                node = node.left;
            }
            node = stack.pop().right;
        }
        return sequence;
    }
}

复杂度分析

  • 时间复杂度: O ( m + n ) O(m + n) O(m+n),其中 m m m n n n 分别是两个二叉树的结点数。对两个二叉树深度优先搜索,每个结点都被访问一次。

  • 空间复杂度: O ( m + n ) O(m + n) O(m+n),其中 m m m n n n 分别是两个二叉树的结点数。空间复杂度主要是栈空间和两个二叉树的叶值序列空间。

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

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

相关文章

消息队列项目(1)

概念 这里的消息队列, 大致上就是一个生产者消费者模型. 我这个消息队列是仿照 RabbitMQ 的实现原理来进行编写的 需求分析 有几个核心的概念: 生产者(Producer)消费者(Consumer)中间人(Broker)发布(Publish) :生产者向中间人投递消息的过程订阅(Subcribe) :记录哪些消费者…

Java面试题 如何提高自己的算法?

练习一&#xff1a;飞机票 需求:机票价格按照淡季旺季、头等舱和经济舱收费、输入机票原价、月份和头等舱或经济舱。 按照如下规则计算机票价格&#xff1a;旺季&#xff08;5-10月&#xff09;头等舱9折&#xff0c;经济舱8.5折&#xff0c;淡季&#xff08;11月到来年4月&a…

【Java可执行命令】(十五)Java进程状态信息获取工具 jps:获取和监控Java进程的状态信息 ~

Java可执行命令之jps 1️⃣ 概念2️⃣ 优势和缺点3️⃣ 使用3.1 语法格式3.2 可选参数&#xff1a;-q3.3 可选参数&#xff1a;-m3.4 可选参数&#xff1a;-l3.5 可选参数&#xff1a;-v3.6 可选参数&#xff1a;-V 4️⃣ 应用场景&#x1f33e; 总结 1️⃣ 概念 JPS&#xff…

【BEV感知】1-BEV感知算法介绍

1-BEV感知算法介绍 1 什么是BEV感知算法&#xff1f;1.1 什么是BEV&#xff1f;1.2 什么是感知&#xff1f;1.3 什么是算法&#xff1f;1.4 什么是BEV感知&#xff1f; 1 什么是BEV感知算法&#xff1f; 1.1 什么是BEV&#xff1f; Bird’s-Eye-View&#xff0c;尺度变化小、…

客户端电脑使用 FTP的Cadence_CIS库方法说明 (下)

简介&#xff1a;随着企业的规模扩大&#xff0c;硬件工程师的增多&#xff0c;使用统一服务器上的库管理&#xff0c;可以减少设计错误&#xff0c;提高效率。 使用在FTP上布局Cadence_CIS库&#xff0c;是目前的主流的做法之一&#xff1b; 本文方法&#xff0c;用于已经配置…

【网络基础进阶之路】一文弄懂TCP的三次握手与四次断开

系列文章&#xff1a; 【网络基础进阶之路】路由器间的静态综合详解 文章目录&#xff1a; 一、TCP协议 二、三次握手——建立连接 三、四次断开——结束连接 一、TCP协议 TCP是一种面向广域网的通信协议&#xff0c;目的是在跨越多个网络通信时&#xff0c;为两个通信端…

如何利用闭环思维解决企业营销问题

彼得圣吉在他的畅销书《第五项修炼》一书中主要介绍了“系统思考”的第五项修炼&#xff0c;系统思考的方法有三个基本元件&#xff1a;不断增强的回馈&#xff0c;反复调节的回馈&#xff0c;和时间滞延。其不断增强的回馈其实就是增强闭环理论&#xff0c;其在企业管理中有很…

嘿嘿嘿~卷王来喽~今天我被卷s了,谁也白想活zhuo!

前言 嘿嘿嘿~热乎乎的卷王来喽&#xff0c;卷呀&#xff01;你们怎么不卷&#xff01;&#xff08;啪&#xff01;电脑一合&#xff09;&#xff0c;好&#xff01;今天&#xff0c;我卷了&#xff0c;我得卷s&#xff0c;但是&#xff01;我被卷了&#xff0c;你们也白想活着…

极狐GitLab 10 年开源研发管理实践:4 个核心步骤突破效能瓶颈

目录 研发效能实践的痛点 4 步击破痛点&#xff0c;提升研发效能 1. 明确目标 2. 优化研发流程 ➤ 2.1 文档先行 ➤ 2.2 可追踪的任务 ➤ 2.3 自动化工作流 3. 注重代码质量 ➤ 3.1 代码门禁&#xff1a;严格要求&#xff0c;提前报错 ➤ 3.2 合并请求&#xff1a;代…

Netty 入门指南

文章目录 前言Netty介绍Netty发展历程Netty核心组件实现HTTP服务器总结 前言 上文《BIO、NIO、IO多路复用模型详细介绍&Java NIO 网络编程》介绍了几种IO模型以及Java NIO&#xff0c;了解了在网络编程时使用哪种模型可以提高系统性能及效率。即使Java NIO可以帮助开发人员…

【java】【maven】【高级】MAVEN聚合继承属性等

目录 1、模块开发与设计 2、聚合 2、继承 3、属性 4、版本管理 5、资源配置 6、多环境配置 7、多环境开发配置 8、跳过测试 9、私服 前言&#xff1a;maven的高级使用包含分模块开发与设计、聚合、继承、属性、版本管理、资源配置、多环境配置、多环境开发配置、跳过…

软件测试缺陷报告

缺陷报告是描述软件缺陷现象和重现步骤地集合。软件缺陷报告Software Bug Report&#xff08;SBR&#xff09;或软件问题报告Software Problem Report&#xff08;SPR&#xff09; 作用&#xff1a;缺陷报告是软件测试人员的工作成果之一&#xff0c;体现软件测试的价值缺陷报…

如何知道企业是否办理过等保备案?哪里可以查询?

对于等保政策细节&#xff0c;大家还存在很多疑问&#xff0c;例如有人在问&#xff0c;如何知道企业是否办理过等保备案&#xff1f;哪里可以查询&#xff1f;今天我们就来简单聊聊&#xff0c;仅供参考。 如何知道企业是否办理过等保备案&#xff1f; 一般企业办理过等保备案…

RISC-V基础指令之shift移动指令slli、srli、srai、sll、srl、sra

RISC-V的shift指令是用于对一个寄存器或一个立即数进行位移运算&#xff0c;并将结果存放在另一个寄存器中的指令。位移运算就是把一个操作数的每一位向左或向右移动一定的位数&#xff0c;得到一个新的位。RISC-V的shift指令有以下几种&#xff1a; slli&#xff1a;左逻辑位…

8.3 作业

整理思维导图 2. 递归实现&#xff0c;输入一个数&#xff0c;输出这个数的每一位 #include <myhead.h> void fun(int t) {if(t 0) return;fun(t/10);printf("%d\n",t%10); } int main(int argc,const char *argv[]) {int t1623809; fun(t);return 0; } 3.递…

虹科方案 | 虹科AR助力汽车产业降本增效!

虹科AR远程解决方案 将高性能的Vuzix AR眼镜与工业远程软件相结合&#xff0c;一线员工使用AR眼镜呼叫专家&#xff0c;由远程专家进行诊断并给出建议&#xff0c;支持一线员工与远程专家实时语音视频交互、AR标注指引、发送文件图片并进行会议录制&#xff0c;帮助一线员工解放…

Linux--对同一个文件分别执行r和w指令,其得到的fd一样吗?

代码&#xff1a; #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h>int main() {int fdopen("log.txt",O_WRONLY|O_CREAT|O_TRUNC);printf("fd_w: %d\n",fd);fdopen("log.txt",O_…

关于账号安全的一些思考

0x01-提升账号安全的目的 注册账号是大多数作弊场景的第一步&#xff0c;例如交易场景的生单、营销场景的秒杀活动等都需要账号的参与。其次账号相对于设备、支付卡等能够给唯一标识用户的资源中具备更好的主动权&#xff0c;因此提升账号安全能力是有必要的。 0x02-问题分析…

TikTok数据分析 | 用好超店有数,生意增长快人一步

TikTok在东南亚崛起之快令人叹服。 在东南亚第一大经济体印度尼西亚&#xff0c;超过200万小商家入驻了TikTok的电商平台&#xff1b; TikTok Shop 以6.9亿美元的收入市场份额超越Lazada成为越南第二大电商平台&#xff1b; 2023年泰国TikTok Shop的销售额一路猛涨&#xff…

交互流程图设计软件都有哪些?

交互流程图是设计行业信息流、观点流或组件流的图形代表。但是市场上应该如何选择各种交互流程图软件呢&#xff1f;如何使用高质量的交互流程图软件来绘制高端氛围的高档流程图&#xff1f;今天&#xff0c;小边给您带来了十个超级实用的交互流程图软件&#xff0c;我希望能帮…