华为机试 - 完全二叉树非叶子部分后序遍历

news2024/11/19 21:22:33

目录

题目描述

输入描述

输出描述

用例

题目解析

算法源码


题目描述

给定一个以顺序储存结构存储整数值的完全二叉树序列(最多1000个整数),请找出此完全二叉树的所有非叶子节点部分,然后采用后序遍历方式将此部分树(不包含叶子)输出。

1、只有一个节点的树,此节点认定为根节点(非叶子)。

2、此完全二叉树并非满二叉树,可能存在倒数第二层出现叶子或者无右叶子的情况

其他说明:二叉树的后序遍历是基于根来说的,遍历顺序为:左-右-根

输入描述

一个通过空格分割的整数序列字符串

输出描述

非叶子部分树结构。备注:输出数字以空格分隔

用例

输入1 2 3 4 5 6 7
输出2 3 1
说明找到非叶子部分树结构,然后采用后序遍历输出。

题目解析

完全二叉树定义

一棵深度为k的有n个结点的二叉树,对树中的结点按从上至下、从左到右的顺序进行编号,如果编号为i(1≤i≤n)的结点与满二叉树中编号为i的结点在二叉树中的位置相同,则这棵二叉树称为完全二叉树。

比如下图就是模拟向完全二叉树中加入元素,可以发现,新加入元素总是优先供给左子树,左子树满了,再考虑右子树。

 

因为上面这个特性,完全二叉树可以用数组模拟,数组元素满足如下规律:

arr[i] 的左孩子是 arr[2*i+1] ,右孩子是 arr[2*i + 2]。(i从0开始计数)

比如数组 arr = [1,2,3,4],则对应完全二叉树如下

 

了解了完全二叉树和数组的关系后,本题的解决就非常简单了,不需要实现一个完全二叉树的数据结构,直接依赖于数组+深度递归就可以完成完全二叉树的后序遍历。

用例的示意图

因此用例的后序遍历是:左-右-根,即2,3,1

由于题目要求不能遍历叶子节点,因此我们需要判定什么节点是叶子

 

如上面两个图所示,只要该节点有左孩子,那么该节点就不是叶子,比如2节点。

因此我们只需要从数组第i个元素开始深度递归,递归逻辑:

假设第i个元素为根,那么它的左孩子是 arr[2*i+1],右孩子是arr[2*i+2]:

  1. 如果左孩子不为空,则说明第i个元素不是叶子,因此继续递归其左孩子,即将左孩子当成新的根来递归。如果递归到本身是叶子节点,则停止递归。
  2. 如果右孩子也不为空,则根据后序遍历原则,还要对右孩子进行递归,即将右孩子也当成根。如果递归到本身是叶子节点,则停止递归。
  3. 打印arr[i]

算法源码

/* JavaScript Node ACM模式 控制台输入获取 */
const readline = require("readline");

const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
});

rl.on("line", (line) => {
  const arr = line.split(" ");
  console.log(getResult(arr));
});

function getResult(arr) {
  if (arr.length === 1) return arr[0];

  const res = [];
  dfs(arr, 0, res);

  return res.join(" ");
}

function dfs(arr, root, res) {
  let left = 2 * root + 1;
  let right = 2 * root + 2;

  if (arr[left]) {
    dfs(arr, left, res);
    if (arr[right]) dfs(arr, right, res);
    res.push(arr[root]);
  }
}

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

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

相关文章

AOP事务管理(下)

Transactional注解可以设置参数。 readOnly:true只读事务,false读写事务,增删改要设为false,查询设为true。 timeout:设置超时时间单位秒,在多长时间之内事务没有提交成功就自动回滚,-1表示不设置超 时时间。 rollbac…

熬夜也要肝完的阿里内部面试官手册,吃透直接拿下大厂心仪 offer

前言 蓦然回首自己做开发已经十年了,这十年中我获得了很多,技术能力、培训、出国、大公司的经历,还有很多很好的朋友。但再仔细一想,这十年中我至少浪费了五年时间,这五年可以足够让自己成长为一个优秀的程序员&#…

ASP.NET通用版权限管理系统源码分享

ASP.NET通用版权限管理系统源码 源码分享!需要源码学习可私信我。 主要功能有:权限管理、角色管理、部门管理、用户管理、公司管理、模块管理、系统设置。 一、 权限管理 以关键字(Key)的方式来定义系统的权限,使系统…

(附源码)springboot农田灌溉设备管理系统 毕业设计 260931

题 目 springboot 农田灌溉设备管理系统 目 录 摘要 1 1 绪论 1 1.1选题的目的和意义 1 1.2研究现状 1 1.3系统开发技术的特色 1 1.4论文结构与章节安排 1 2 农田灌溉设备管理系统 系统分析 3 2.1 可行性分析 3 2.2 系统流程分析 3 2.2.1数据增加流程 3 2.3.2数据修改流程…

强的离谱!阿里人用五个模块讲明白了SpringCloud,已开源!

微服务 作为一名Java程序员如果你对微服务不了解,就会在学习或者使用的过程中觉得有点“晕”。微服务是一种面向服务的软件架构模式! 我们常说,架构设计的核心是满足降本增效。该怎么理解? 举个例子,微服务架构之所…

简单学校网页设计作业 静态HTML校园博客主页 DW大学网站模板下载 大学生简单我的学校网页作品代码 个人网页制作 学生个人网页设计作业

🎉精彩专栏推荐 💭文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业: 【📚毕设项目精品实战案例 (10…

[附源码]计算机毕业设计JAVA疫苗接种管理系统

[附源码]计算机毕业设计JAVA疫苗接种管理系统 项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybati…

AIGC的一些材料

概念和前景 先看亚马逊AWS给AIGC的定义。 AIGC 是什么_亚马逊云科技 AIGC 解决方案 它有多个模态分支,但大同小异。 Diffusion预训练成本降低6.5倍,微调硬件成本降低7倍!Colossal-AI完整开源方案低成本加速AIGC产业落地 背景 1.01亿美元融资…

Java项目:SSM电器商城系统

作者主页:源码空间站2022 简介:Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 项目介绍 本项目分为前后台,前台为普通用户登录,后台为管理员登录; 管理员角色包含以下功能: 管理员登录…

低功耗局域网通信硬件之lora——sx1262-sx1276硬件设计开发

1.lora简介 LoRa是semtech公司开发的一种低功耗局域网无线标准,其名称“LoRa”是远距离无线电(Long Range Radio),它最大特点就是在同样的功耗条件下比其他无线方式传播的距离更远,实现了低功耗和远距离的统一&#x…

浅谈ES标准的演变

ECMAScript从1997年第一版诞生依赖,经过无数人的“踩坑”和“填坑”,到现在,ES12呼之欲出。那么我们不妨讨论一下ES的发展历程,看它如何统一江湖,看它“曲折”而又令人期待的发展之路。 最近分析typescript&#xff0c…

双机互备是什么意思?双机互备就是双机热备吗?

看到不少小伙伴在问,双机互备是什么意思?双机互备就是双机热备吗?今天我们就来一起简单了解了解吧! 双机互备是什么意思?双机互备就是双机热备吗? 双机互备是指在双机热备的基础上,两个相对独…

【AI数学】余弦相似性(含python实现)

Cosine Similarity,即余弦相似度,又叫余弦相似性。是一个中学数学的概念,即用两个向量之间的夹角余弦值代表这两个向量之间的相似度。 Cosine Similarity虽然简单,但广泛应用在AI模型中,比如CLIP计算图像embedding和文…

【KCP】UDP可靠性传输

1 如何做到可靠性传输 ◼ ACK机制 ◼ 重传机制 ◼ 序号机制 3 2 1 -》2 3 1 ◼ 重排机制 2 3 1 ->3 2 1 ◼ 窗口机制 Tcp不用我们管 可靠性udp 5种机制都需要用户层处理 2 UDP与TCP,我们如何选择 3 UDP如何可靠,KCP协议在哪些方面有优势 以10%-20%…

Java人事管理系统oa人力人事办公(含源码+论文+答辩PPT等)

项目功能简介: 该项目采用技术JSP、Struts2、MyBatis、dwr、Tomcat服务器、MySQL数据库、项目含有源码、配套开发软件、软件安装教程、项目发布教程以及代码讲解教程 【项目使用技术:】Struts2MyBatisdwrjqueryjscss等技术 【技术特色】 文件上传: Strut…

Android依赖注入与Hilt的使用

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 基础知识 一、依赖注入是什么? 二.如果依赖注入这么简单,为什么需要专门开发一个框架? 三.安卓的依赖注入框架Dagger与Hilt 四.…

[附源码]计算机毕业设计基于Springboot甜品购物网站

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

如何恢复文件夹隐藏文件?超实用的2种技巧来了

案例:电脑中毒,文件夹数据自动隐藏,现在全都找不到了怎么办?——在日常办公使用电脑过程当中,总会遇到这样那样的问题,比如文件夹数据隐藏问题,当我们需要这些数据时如何恢复正常呢?…

java计算机毕业设计ssm图书馆管理系统z3z90(附源码、数据库)

java计算机毕业设计ssm图书馆管理系统z3z90(附源码、数据库) 项目运行 环境配置: Jdk1.8 Tomcat8.5 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)…

[附源码]计算机毕业设计基于SpringBoot的疫苗接种管理系统

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…