二叉树题目:二叉树寻路

news2024/10/6 18:35:05

文章目录

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

题目

标题和出处

标题:二叉树寻路

出处:1104. 二叉树寻路

难度

5 级

题目描述

要求

在一个无限的二叉树上,每个结点都有两个子结点,结点按行标号。

在奇数行(即,第一行、第三行、第五行……)中,按从左到右的顺序标号。在偶数行(即,第二行、第四行、第六行……)中,按从右到左的顺序标号。

示例

给定树上某一个结点的标号 label \texttt{label} label,返回从根结点到标号为 label \texttt{label} label 的结点的路径,该路径是由途经的结点标号所组成的。

示例

示例 1:

输入: label   =   14 \texttt{label = 14} label = 14
输出: [1,3,4,14] \texttt{[1,3,4,14]} [1,3,4,14]

示例 2:

输入: label   =   26 \texttt{label = 26} label = 26
输出: [1,2,6,10,26] \texttt{[1,2,6,10,26]} [1,2,6,10,26]

数据范围

  • 1 ≤ label ≤ 10 6 \texttt{1} \le \texttt{label} \le \texttt{10}^\texttt{6} 1label106

解法

思路和算法

首先考虑一个简单的问题:如果二叉树的每一行都是按从左到右的顺序标号,如何得到从根结点到标号为 label \textit{label} label 的结点的路径。当每一行都按从左到右的顺序标号时,对于标号为 x x x 的结点,其左子结点标号为 2 x 2x 2x,右子结点标号为 2 x + 1 2x + 1 2x+1,如果 x > 1 x > 1 x>1,则其父结点标号为 ⌊ x 2 ⌋ \Big\lfloor \dfrac{x}{2} \Big\rfloor 2x。因此,对于给定的标号 label \textit{label} label,可以利用上述性质得到从该标号结点到根结点的路径,将路径翻转之后即可得到从根结点到该标号结点的路径。

这道题中,二叉树的奇数行按从左到右的顺序标号,二叉树的偶数行按从右到左的顺序标号,因此需要将标号转换之后才能得到结点位置。考虑二叉树的每一行都是按从左到右的顺序标号,将这样的标号称为下标,和题中定义的标号区分。结点的标号与下标之间的关系如下。

  • 奇数行结点的标号与下标相同。

  • 偶数行结点的标号与下标不同,将整行的下标翻转之后即为标号。

这道题规定根结点在第 1 1 1 层,则第 i i i 层有 2 i − 1 2^{i - 1} 2i1 个结点,结点的标号范围是 [ 2 i − 1 , 2 i − 1 ] [2^{i - 1}, 2^i - 1] [2i1,2i1]。当 i i i 是偶数时,第 i i i 行的每个结点的标号与下标之和为 2 i − 1 + 2 i − 1 2^{i - 1} + 2^i - 1 2i1+2i1,由此可以得到同一个结点的标号与下标之间的换算关系。

根据层数与结点标号范围的关系可以定位到标号为 label \textit{label} label 的结点所在层,然后计算从标号为 label \textit{label} label 的结点到根结点的路径,最后将路径翻转即可得到从根结点到标号为 label \textit{label} label 的结点的路径。

对于标号为 label \textit{label} label 的结点,如果其所在层是奇数,则结点下标与标号相同,如果其所在层是偶数,则需要根据换算关系得到结点下标。

得到标号为 label \textit{label} label 的结点的下标之后,即可得到路径上的所有结点下标。对于每个结点下标,根据结点所在层的奇偶性和层数计算结点标号,将标号添加到路径中,当到达标号为 1 1 1 的结点即根结点时,得到反向路径,将反向路径翻转即可得到结果路径。

以下用题目中的两个例子说明。

示例 1, label = 14 \textit{label} = 14 label=14。标号为 label \textit{label} label 的结点在第 4 4 4 层,层数是偶数,该结点的下标是 9 9 9。从该结点到根结点的路径上的结点的下标依次是 [ 9 , 4 , 2 , 1 ] [9, 4, 2, 1] [9,4,2,1],标号依次是 [ 14 , 4 , 3 , 1 ] [14, 4, 3, 1] [14,4,3,1],翻转后得到从根结点到标号为 label \textit{label} label 的结点的路径 [ 1 , 3 , 4 , 14 ] [1, 3, 4, 14] [1,3,4,14]

示例 2, label = 26 \textit{label} = 26 label=26。标号为 label \textit{label} label 的结点在第 5 5 5 层,层数是奇数,该结点的下标是 26 26 26。从该结点到根结点的路径上的结点的下标依次是 [ 26 , 13 , 6 , 3 , 1 ] [26, 13, 6, 3, 1] [26,13,6,3,1],标号依次是 [ 26 , 10 , 6 , 2 , 1 ] [26, 10, 6, 2, 1] [26,10,6,2,1],翻转后得到从根结点到标号为 label \textit{label} label 的结点的路径 [ 1 , 2 , 6 , 10 , 26 ] [1, 2, 6, 10, 26] [1,2,6,10,26]

代码

class Solution {
    public List<Integer> pathInZigZagTree(int label) {
        int level = 1;
        int start = 1, end = 1;
        while (end < label) {
            level++;
            start *= 2;
            end = end * 2 + 1;
        }
        int num = level % 2 == 1 ? label : start + end - label;
        List<Integer> path = new ArrayList<Integer>();
        while (num > 0) {
            int curr = level % 2 == 1 ? num : start + end - num;
            path.add(curr);
            num /= 2;
            level--;
            start /= 2;
            end /= 2;
        }
        Collections.reverse(path);
        return path;
    }
}

复杂度分析

  • 时间复杂度: O ( log ⁡ label ) O(\log \textit{label}) O(loglabel)。定位到标号为 label \textit{label} label 的结点所在的层需要 O ( log ⁡ label ) O(\log \textit{label}) O(loglabel) 的时间,得到从根结点到标号为 label \textit{label} label 的结点的路径也需要 O ( log ⁡ label ) O(\log \textit{label}) O(loglabel) 的时间。

  • 空间复杂度: O ( 1 ) O(1) O(1)。除了返回值以外,使用的空间是常数。

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

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

相关文章

logicFlow 流程图编辑工具使用及开源地址

一、工具介绍 LogicFlow 是一款流程图编辑框架&#xff0c;提供了一系列流程图交互、编辑所必需的功能和灵活的节点自定义、插件等拓展机制。LogicFlow 支持前端研发自定义开发各种逻辑编排场景&#xff0c;如流程图、ER 图、BPMN 流程等。在工作审批配置、机器人逻辑编排、无…

玩转Linux Shell Terminal Tmux

一、Shell编程☘️ 1. Shell指令快捷操作 1. echo # 系统指令 $ echo $(pwd) # 对于系统自带的pwd&#xff0c;此处不能写echo $pwd# 自定义变量 $ foo$(pwd) $ echo $foo # 不同于pwd&#xff0c;对于自定义的foo&#xff0c;不能用$(foo)2. !! # 假设你先执行了以下原本…

JOSEF约瑟 矿用一般型选择性漏电继电器 LXY2-660 Φ45 JKY1-660

系列型号&#xff1a; JY82A检漏继电器 JY82B检漏继电器 JY82-380/660检漏继电器 JY82-IV检漏继电器 JY82-2P检漏继电器 JY82-2/3检漏继电器 JJKY检漏继电器 JD型检漏继电器 JY82-IV;JY82J JY82-II;JY82-III JY82-1P;JY82-2PA;JY82-2PB JJB-380;JJB-380/660 JD-12…

Generics/泛型, ViewBuilder/视图构造器 的使用

1. Generics 泛型的定义及使用 1.1 创建使用泛型的实例 GenericsBootcamp.swift import SwiftUIstruct StringModel {let info: String?func removeInfo() -> StringModel{StringModel(info: nil)} }struct BoolModel {let info: Bool?func removeInfo() -> BoolModel…

解析Moonbeam的安全性、互操作性和市场竞争力

Moonbeam依托Polkadot Substrate框架构建&#xff0c;用Rust程序设计语言创建的智能合约区块链平台&#xff0c;在继承Polkadot安全性的基础上为项目提供以太坊虚拟机&#xff08;EVM&#xff09;的兼容性和原生的跨链互操作性优势。Moonbeam的EVM兼容性表示开发者无需学习Subs…

LeetCode-102-二叉树的层序遍历

题目描述&#xff1a; 给你二叉树的根节点 root &#xff0c;返回其节点值的 层序遍历 。 &#xff08;即逐层地&#xff0c;从左到右访问所有节点&#xff09;。 题目链接&#xff1a;LeetCode-102-二叉树的层序遍历 解题思路&#xff1a; 使用队列 先进先出的特点存储每次遍…

spring 通过有参构造方法注入

1.先写一个有参构造方法 2.给构造方法里面的属性 name 赋值 lisi 3.测试

[ROS2系列] ubuntu 20.04测试rtabmap 3D建图(二)

接上文我们继续 如果我们要在仿真环境中进行测试&#xff0c;需要将摄像头配置成功。 一、配置位置 sudo vim /opt/ros/foxy/share/turtlebot3_gazebo/models/turtlebot3_waffle/model.sdf 二、修改 <joint name"camera_rgb_optical_joint" type"fixed&…

【数据库】Sql Server数据迁移,处理自增字段赋值

给自己一个目标&#xff0c;然后坚持一段时间&#xff0c;总会有收获和感悟&#xff01; 在实际项目开发中&#xff0c;如果遇到高版本导入到低版本&#xff0c;或者低版本转高版本&#xff0c;那么就会出现版本不兼容无法导入&#xff0c;此时通过程序遍历创建表和添加数据方式…

CRMEB多商户商城系统阿里云集群部署教程

注意: 1.所有服务创建时地域一定要选择一致,这里我用的是杭州K区 2.文件/图片上传一定要用类似oss的云文件服务, 本文不做演示 一、 创建容器镜像服务&#xff0c;容器镜像服务(aliyun.com) ,个人版本就可以 先创建一个命名空间 然后创建一个镜像仓库 查看并记录镜像公网地址…

Flink之窗口聚合算子

1.窗口聚合算子 在Flink中窗口聚合算子主要分类两类 滚动聚合算子(增量聚合)全窗口聚合算子(全量聚合) 1.1 滚动聚合算子 滚动聚合算子一次只处理一条数据,通过算子中的累加器对聚合结果进行更新,当窗口触发时再从累加器中取结果数据,一般使用算子如下: aggregatemaxmaxBy…

Unity中Shader光照模型Phong

文章目录 前言一、Phong光照模型二、图示解释Phone光照模型1、由图可得&#xff0c;R 可以由 -L 加上 P 得出2、P等于2*M3、因为 N 和 L 均为单位向量&#xff0c;所以 M 的模可以由 N 和 L得出4、得到M的模后&#xff0c;乘以 单位向量N&#xff0c;得到M5、最后得出 P 和 R 前…

Prometheus-Prometheus安装及其配置

Prometheus-Prometheus安装及其配置 Prometheus安装下载解压 配置启动prometheus校验配置文件表达式浏览器 Prometheus安装 Prometheus的安装针对Linux的安装&#xff0c;其他的安装方式可以查看Prometheus官网 下载 sudo wget https://github.com/prometheus/prometheus/re…

四款数字办公工具大比拼,在线办公无压力

在线办公软件使企业、员工实现办公场所、距离的自由&#xff0c;尤其是近几年&#xff0c;受“口罩”的影响&#xff0c;远程办公软件的使用者也越来越多&#xff0c;无论是财务、行政、还是设计师&#xff0c;都开始追求好用的在线办公软件&#xff0c;作为办公软件发烧友&…

发送消息时序图

内窥镜消息队列发送消息原理 目的 有一个多线程的Java应用程序&#xff0c;使用消息队列来处理命令 时序图 startumlactor User participant "sendCmdWhiteBalance()" as Controller participant CommandConsumer participant MessageQueueUser -> Controller:…

​左手 Serverless,右手 AI,7 年躬身的古籍修复之路

作者&#xff1a;宋杰 “AI 可以把我们思维体系当中&#xff0c;过度专业化、过度细分的这些所谓的知识都替代掉&#xff0c;让我们集中精力去体验自己的生命。我挺幸运的&#xff0c;代码能够有 AI 辅助&#xff0c;也能够有 Serverless 解决我的运营成本问题。Serverless 它…

mybatis拦截器源码分析

mybatis拦截器源码分析 拦截器简介 mybatis Plugins 拦截器由于Mybatis对数据库访问与操作进行了深度的封装,让我们应用开发效率大大提高,但是灵活度很差拦截器的作用:深度定制Mybatis的开发抛出一个需求 :获取Mybatis在开发过程中执行的SQL语句(执行什么操作获取那条SQL语句…

RK3562开发板:升级摄像头ISP,突破视觉体验边界

RK3562开发板作为深圳触觉智能新推出的爆款产品&#xff0c;采用 Rockchip 新一代 64 位处理器 RK3562&#xff08;Quad-core ARM Cortex-A53&#xff0c;主频最高 2.0GHz&#xff09;&#xff0c;最大支持 8GB 内存&#xff1b;内置独立的 NPU&#xff0c;可用于轻量级人工智能…

谷歌浏览查询http被自动转化成https导致页面读取失败问题处理

原因&#xff1a; 谷歌浏览器版本升级&#xff0c;安全问题考虑自动转化https 解决方案&#xff1a; 一、打开配置页面&#xff1a; chrome://flags/ 二、禁止自动转化

vue3_setup基础_渲染函数(ref,reactive)

一、setup语法糖 是什么&#xff1a;组合式Api &#xff08;vue2为option Api&#xff09; 来解决什么问题&#xff1a;使用&#xff08;data,computed,methonds,watch&#xff09;组件选项来组织逻辑通常都很有效。然而&#xff0c;当我们组件变的更大的时候&#xff0c;逻辑…