当前位置: 首页 > news >正文

按照层次遍历结果打印完全二叉树

按照层次遍历结果打印完全二叉树

在这里插入图片描述

按照推论结果:

  • l 层首个节点位置 2h-l - 1
  • l 层节点间距:2h-l+1 - 1

编码实现

 public static<E> void print(BinaryTree<E> tree) {List<List<Node<E>>> levelNodeList = levelOrderTraversal(tree);int height = levelNodeList.size();for (int level = 1; level <= height; level++) {List<Node<E>> nodelist = levelNodeList.get(level - 1);// 打印首个节点int firstNodePosition = (int) Math.pow(2, (height - level)) - 1;System.out.print(getBlankSpace(firstNodePosition) + nodelist.get(0).element);int separation = (int)Math.pow(2, (height-level+1)) - 1;String separationBlankSpace = getBlankSpace(separation);for (int i = 1; i < nodelist.size(); i++) {// 打印中间节点System.out.print(separationBlankSpace + nodelist.get(i).element);}System.out.println();}}public static<E>List<List<Node<E>>> levelOrderTraversal(BinaryTree<E> tree) {Queue<Node<E>> queue = new LinkedList<>();queue.offer(tree.root);List<List<Node<E>>> result = new ArrayList<>();while (!queue.isEmpty()) {// 此时队列的容量就是当前层的节点个数int levelSize = queue.size();ArrayList<Node<E>> levelNodes = new ArrayList<>();for (int i = 0; i < levelSize; i++) {Node<E> node = queue.poll();levelNodes.add(node);if (node.left != null) {queue.offer(node.left);}if (node.right!= null) {queue.offer(node.right);}}result.add(levelNodes);}return result;}private static String getBlankSpace(int n) {StringBuilder builder = new StringBuilder();while (n > 0) {builder.append(" ");n--;}return builder.toString();}

打印效果

在这里插入图片描述

似乎更预想的不一样,猜测是因为 像 11,12这种两位数实际占了两个字符,导致的。将所有数都改成 1:

在这里插入图片描述

显示完美。

将空格改为 \t

在这里插入图片描述

显示还是有问题。考虑将最后一层间距修改为 2,通过双 \t 控制显示格式

在这里插入图片描述

完整代码

package com.wy.algo.tree;import cn.hutool.core.lang.Assert;import java.util.*;
import java.util.stream.IntStream;
import java.util.stream.Stream;/*** @author HelloWorld* @date 2024/1/2 18:32* @email helloworld.dng@gmail.com*/
public class BinaryTree<E> {public static void main(String[] args) {BinaryTree<Integer> binaryTree = init(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);//BinaryTree<Integer> binaryTree = init(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1);print(binaryTree);}Node<E> root;/*** @description 初始化二叉树(层次遍历)* @author HelloWorld* @create 2024/1/2 18:57* @param elements* @return com.wy.algo.tree.BinaryTree<E>*/@SafeVarargspublic static<E> BinaryTree<E> init(E... elements) {Assert.notEmpty(elements, "elements must not be empty");BinaryTree<E> tree = new BinaryTree<>();tree.root = new Node<>(elements[0]);Queue<Node<E>> queue = new LinkedList<>();queue.offer(tree.root);int index = 1;while (!queue.isEmpty()) {Node<E> node = queue.poll();if (index < elements.length) {node.left = new Node<>(elements[index]);queue.offer(node.left);}index++;if (index < elements.length) {node.right = new Node<>(elements[index]);queue.offer(node.right);}index++;}return tree;}public static<E> void print(BinaryTree<E> tree) {List<List<Node<E>>> levelNodeList = levelOrderTraversal(tree);int height = levelNodeList.size();for (int level = 1; level <= height; level++) {List<Node<E>> nodelist = levelNodeList.get(level - 1);// 打印首个节点int firstNodePosition = (int) Math.pow(2, (height - level)) - 1;System.out.print(getBlankSpace(firstNodePosition) + nodelist.get(0).element);// 优化显示效果,将间距修改为2int separation = (int)Math.pow(2, (height-level+1));String separationBlankSpace = getBlankSpace(separation);for (int i = 1; i < nodelist.size(); i++) {// 打印中间节点System.out.print(separationBlankSpace + nodelist.get(i).element);}System.out.println();}}public static<E>List<List<Node<E>>> levelOrderTraversal(BinaryTree<E> tree) {Queue<Node<E>> queue = new LinkedList<>();queue.offer(tree.root);List<List<Node<E>>> result = new ArrayList<>();while (!queue.isEmpty()) {// 此时队列的容量就是当前层的节点个数int levelSize = queue.size();ArrayList<Node<E>> levelNodes = new ArrayList<>();for (int i = 0; i < levelSize; i++) {Node<E> node = queue.poll();levelNodes.add(node);if (node.left != null) {queue.offer(node.left);}if (node.right!= null) {queue.offer(node.right);}}result.add(levelNodes);}return result;}private static String getBlankSpace(int n) {StringBuilder builder = new StringBuilder();while (n > 0) {builder.append("\t");n--;}return builder.toString();}/*** @description 根据节点个数,计算完全二叉树的高度* @author HelloWorld* @create 2024/1/2 19:48* @param nodeNums* @return int*/public static int getHeight(int nodeNums) {int level = 1;while (!(Math.pow(2, level - 1) <= nodeNums && Math.pow(2, level) > nodeNums)) {level++;}return level;}static class Node<E> {E element;Node<E> left;Node<E> right;public Node(E element) {this.element = element;this.left = null;this.right = null;}}
}

相关文章:

按照层次遍历结果打印完全二叉树

按照层次遍历结果打印完全二叉树 按照推论结果&#xff1a; l 层首个节点位置 2h-l - 1l 层节点间距&#xff1a;2h-l1 - 1 编码实现 public static<E> void print(BinaryTree<E> tree) {List<List<Node<E>>> levelNodeList levelOrderTraver…...

基于SpringBoot的药店管理系统

文章目录 项目介绍主要功能截图:部分代码展示设计总结项目获取方式🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 🍅文末获取源码联系🍅 项目介绍 基于SpringBoot的药店管理系统,java项目…...

Java 泛型深入解析

Java 中的泛型是一种强大的编程特性&#xff0c;允许我们编写更加通用和类型安全的代码。本篇博客将深入探讨 Java 泛型的各个方面&#xff0c;包括泛型类、泛型方法、泛型接口以及泛型通配符。 1. 泛型类 首先&#xff0c;让我们看一个简单的泛型类的例子。在下面的代码中&a…...

Apache Doris (六十): Doris - 物化视图

🏡 个人主页:IT贫道_大数据OLAP体系技术栈,Apache Doris,Clickhouse 技术-CSDN博客 🚩 私聊博主:加入大数据技术讨论群聊,获取更多大数据资料。 🔔 博主个人B栈地址:豹哥教你学编程的个人空间-豹哥教你学编程个人主页-哔哩哔哩视频 目录...

【javaweb】tomcat9.0中的HttpServlet

2023年12月28日&#xff0c;周四晚上 目录 什么是HttpServlet tomcat中的HttpServlet由谁产生 什么是HttpServlet 在Tomcat中&#xff0c;HttpServlet 是 Java Servlet API 中的一个抽象类&#xff0c;用于简化基于HTTP协议的Servlet的开发。HttpServlet 扩展了 GenericServ…...

数据结构学习笔记——查找算法中的树形查找(B树、B+树)

目录 前言一、B树&#xff08;一&#xff09;B树的概念&#xff08;二&#xff09;B树的性质&#xff08;三&#xff09;B树的高度&#xff08;四&#xff09;B树的查找&#xff08;五&#xff09;B树的插入&#xff08;六&#xff09;B树的删除 二、B树&#xff08;一&#xf…...

python包chromadb安装失败总结

1&#xff0c;背景&#xff1a; 最近在学习langchain的课程&#xff0c;里面创建自己的知识库的Retrieval模块中&#xff0c;需要用到向量数据库。 所以按照官方的教程&#xff08;vectorstores&#xff09;&#xff0c;准备使用chroma的向量数据库。图片来源 2&#xff0c;问…...

机器学习(四) -- 模型评估(2)

系列文章目录 机器学习&#xff08;一&#xff09; -- 概述 机器学习&#xff08;二&#xff09; -- 数据预处理&#xff08;1-3&#xff09; 机器学习&#xff08;三&#xff09; -- 特征工程&#xff08;1-2&#xff09; 机器学习&#xff08;四&#xff09; -- 模型评估…...

泊松分布与二项分布的可加性

泊松分布与二项分布的可加性 泊松分布的可加性 例 : 设 X , Y X,Y X,Y 相互独立 , X ∼ P ( λ 1 ) X\sim P(\lambda_1) X∼P(λ1​) , Y ∼ P ( λ 2 ) Y\sim P(\lambda_2) Y∼P(λ2​) , 求证 Z X Y ZXY ZXY 服从参数为 λ 1 λ 2 \lambda_1 \lambda_2 λ1​λ2​ …...

【PostgreSQL】约束-排他约束

【PostgreSQL】约束链接 检查 唯一 主键 外键 排他 排他约束 排他约束是一种数据库约束&#xff0c;用于确保某一列或多个列中的值在每一条记录中都是唯一的。这意味着任何两条记录都不能具有相同的值。 排他约束可以在数据库中创建唯一索引或唯一约束来实现。当尝试插入或更…...

Java重修第一天—学习数组

1. 认识数组 建议1.5倍速学习&#xff0c;并且关闭弹幕。 数组的定义&#xff1a;数组是一个容器&#xff0c;用来存储一批同种类型的数据。 下述图&#xff1a;是生成数字数组和字符串数组。 为什么有了变量还需要定义数组呢&#xff1f;为了解决在某些场景下&#xff0c;变…...

【C#】知识点实践序列之Lock的锁定代码块

大家好&#xff0c;我是全栈小5&#xff0c;欢迎来到《小5讲堂之知识点实践序列》文章。 2024年第1篇文章&#xff0c;此篇文章是C#知识点实践序列之Lock知识点&#xff0c;博主能力有限&#xff0c;理解水平有限&#xff0c;若有不对之处望指正&#xff01; 本篇验证Lock锁定代…...

StringBad ditto (motto)

第12章 类和动态内存分配 StringBad ditto (motto): // calls StringBad (comst StringBad &) StringBad metoo - motto: // calls StringBad (const StringBad &) StringBad also StringBad (motto): // calls StringBad (const StringBad &) StringBad * pStri…...

Redis缓存击穿、缓存雪崩、缓存穿透

缓存击穿&#xff08;某个热点key缓存失效&#xff09; 概念 缓存中没有但数据库中有的数据&#xff0c;假如是热点数据&#xff0c;那key在缓存过期的一刻&#xff0c;同时有大量的请求&#xff0c;这些请求都会击穿到DB&#xff0c;造成瞬时DB请求量大、压力增大和缓存雪崩的…...

【PCB专题】Allegro封装更新焊盘

在PCB封装的绘制中&#xff0c;有时会出现需要更新焊盘的情况。比如在制作封装的过程中发现焊盘做的不对而使用PAD_Designer重新更新了焊盘。 那在PCB中如何更新已经修改过的焊盘呢&#xff1f; 打开封装&#xff0c;选择Tools->Padstack->Refresh... 选择Refresh all …...

ES6之Reflect详解

✨ 专栏介绍 在现代Web开发中&#xff0c;JavaScript已经成为了不可或缺的一部分。它不仅可以为网页增加交互性和动态性&#xff0c;还可以在后端开发中使用Node.js构建高效的服务器端应用程序。作为一种灵活且易学的脚本语言&#xff0c;JavaScript具有广泛的应用场景&#x…...

文件监控-IT安全管理软件

文件监控和IT安全管理软件是用于保护企业数据和网络安全的工具。这些工具可以帮助企业监控文件的变化&#xff0c;防止未经授权的访问和修改&#xff0c;并确保数据的安全性和完整性。 一、具有哪些功能 文件监控软件可以实时监控文件系统的活动&#xff0c;包括文件的创建、修…...

达梦数据库安装超详细教程(小白篇)

文章目录 达梦数据库一、达梦数据库简介二、达梦数据库下载三、达梦数据库安装1. 解压2. 安装 四、初始化数据库五、DM管理工具 达梦数据库 一、达梦数据库简介 ​ 达梦数据库管理系统是达梦公司推出的具有完全自主知识产权的高性能数据库管理系统&#xff0c;简称DM。 达梦数…...

复试 || 就业day09(2024.01.04)算法篇

文章目录 前言验证外星语词典在长度 2N 的数组中找出重复 N 次的元素找到小镇的法官查找共用字符数组的相对排序分发饼干分发糖果区间选点(AcWing)最大不相交区间数量(AcWing)无重叠区间关于重写小于号 前言 &#x1f4ab;你好&#xff0c;我是辰chen&#xff0c;本文旨在准备考…...

Win10电脑关闭OneDrive自动同步的方法

在Win10电脑操作过程中&#xff0c;用户想要关闭OneDrive的自动同步功能&#xff0c;但不知道具体要怎么操作&#xff1f;首先用户需要打开OneDrive&#xff0c;然后点击关闭默认情况下将文档保存到OneDrive选项保存&#xff0c;最后关闭在这台电脑上同步设置保存就好了。接下来…...

linux(centos)相关

文件架构&#xff1a; bin--binary--二进制命令&#xff0c;可直接执行 sbin systembin系统二进制命令&#xff0c;超级管理员 lib 库目录 类似dll文件 lib64 64位系统相关的库文件 usr 用户文件 boot 引导分区的文件&#xff0c;链接&#xff0c;系统启动等 dev device设备目录…...

外贸网站显示不安全警告怎么办?消除网站不安全警告超全指南

外贸网站显示不安全警告怎么办&#xff1f;当用户访问你的网站&#xff0c;而您的网站没有部署SSL证书实现HTTPS加密时&#xff0c;网站就会显示不安全警告&#xff0c;这种警告&#xff0c;不仅有可能阻止用户继续浏览网站&#xff0c;影响网站声誉&#xff0c;还有可能影响网…...

Java:HeapMemory和DirectMemory配置与使用介绍

目录 一、Heap内存 1、查看Heap内存配置的最大值 2、配置Heap内存最大值的方式 3、配置Heap内存最小值的方式 4、查看已使用Heap内存的方式 5、查看未使用Heap内存的方式 二、Direct内存 1、查看Direct内存配置的最大值 2、配置Direct内存最大值的方式 3、获取Direct…...

记 -bash: docker-compose: command not found 的问题解决

docker-compose: command not found 错误表明系统无法找到 docker-compose 命令。这可能是因为 docker-compose 并未正确安装&#xff0c;或者其可执行文件的路径未包含在系统的 PATH 变量中。 以下是我遇到时解决方法&#xff1a; 确保 Docker 和 Docker Compose 已安装&…...

分享10篇优秀论文,涉及图神经网络、大模型优化、表格分析

引言 第38届AAAI人工智能年度会议将于2024年2月在加拿大温哥华举行。今天给大家分享十篇AAAI2024论文&#xff0c;主要涉及图神经网络&#xff0c;大模型幻觉、中文书法文字生成、表格数据分析、KGs错误检测、多模态Prompt、思维图生成等。 论文获取方式&#xff0c;回复&am…...

Ubuntu 24.04 Preview 版安装 libtinfo5

Ubuntu 24.04 Preview 版安装 libtinfo5 0. 背景1. 安装 libtinfo52. 安装 cuda 0. 背景 Ubuntu 24.04 Preview 版安装 Cuda 时报确实 libtinfo5 的错误。 1. 安装 libtinfo5 wget http://archive.ubuntu.com/ubuntu/pool/universe/n/ncurses/libtinfo5_6.4-2_amd64.deb dpk…...

Spring AOP<一>简介与基础使用

spring AOP 基础定义 含义使用切面组织多个Advice,Advice放在切面中定义。也就是说是定义通知的自定义类。自定义的AOP类Aspect连接点方法调用&#xff0c;异常抛出可以增强的点JoinPoint &#xff1a;也就是**被增强的方法的总称&#xff0c;可以获取具体方法的信息&#xff…...

react ant tree节点没有children也会显示展开框 节点有children却不显示展开框

1.背景 最近处理树状结构时遇到了一个诡异问题&#xff0c;后端返回了组织树&#xff0c;组织树里面可能有组织&#xff0c;也可能有用户&#xff0c;很奇怪的是所有用户都会显示展开图标&#xff0c;而组织有些会显示展开图标&#xff0c;有些不会显示 2.分析 一开始找到了用…...

【Linux】进程查看|fork函数|进程状态

&#x1f984; 个人主页——&#x1f390;开着拖拉机回家_Linux,大数据运维-CSDN博客 &#x1f390;✨&#x1f341; &#x1fa81;&#x1f341;&#x1fa81;&#x1f341;&#x1fa81;&#x1f341;&#x1fa81;&#x1f341; &#x1fa81;&#x1f341;&#x1fa81;&am…...

LeetCode第98题 - 有效的括号

题目 解答 方案一 class Solution {public boolean isValidBST(TreeNode root) {if (root null) {return true;}if (root.left null && root.right null) {return true;}if (root.left ! null && root.left.val > root.val) {return false;}if (root.…...

研发网站要多长时间/搜索引擎优化的分类

此文是依据赵磊在【QCON高可用架构群】中的分享内容整理而成。转载请事先联系赵磊及相关编辑。 赵磊&#xff0c;Uber高级project师&#xff0c;08年上海交通大学毕业。曾就职于微软。后添加Facebook主要负责Messenger的后端消息服务。这个系统在当时支持Facebook全球5亿人同一…...

做茶道网站/网上推广平台有哪些

今天和大家分享一下win7系统IIS7站点页面无法正常显示问题的解决方法&#xff0c;在使用win7系统的过程中经常不知道如何去解决win7系统IIS7站点页面无法正常显示的问题&#xff0c;有什么好的办法去解决win7系统IIS7站点页面无法正常显示呢&#xff1f;小编教你只需要1、首先点…...

wordpress实现伪静态/上海短视频推广

前几天有网友问在输入坐标或长度的时候是否能输入公式&#xff0c;比如20/3或7*8这样简单的算式。cad虽然在定位点或长度时不能直接输入算式&#xff0c;但利用计算器功能不仅可以输入数字的算式&#xff0c;还可以输入点之前的算式&#xff0c;点可以是直接拾取的点&#xff0…...

小超人成都网站建设/营销型网站模板

漏洞介绍 Struts2在使用Freemarker模块引擎的时候,同时允许解析OGNL表达式。导致用户输入的数据本身不会被OGNL解析,但是由于被Freemarker解析一次后变成离开一个表达式,被OGNL解析第二次,导致任意命令执行漏洞。 影响版本 Struts 2.0.1 - Struts 2.3.33、Struts 2.5 - Stru…...

河北建设厅网站登录密码错误/网站底部友情链接代码

今天知道的一个物联网开发和管理平台&#xff0c;算是边缘计算中应用层的框架 这个我之前也了解过一些&#xff0c;但是其他的平台基本都会有出自己的硬件&#xff0c;因为从物联网开发来看&#xff0c;确实底层和硬件开发占了大部分时间&#xff0c;但是创造效益却主要是应用…...

wordpress 主页 导航/搜索引擎营销的实现方法有

一、指令 1.什么是指令 指令 (Directives) 是带有 v- 前缀的特殊属性。例如在入门案例中的v-model&#xff0c;代表双向绑定。指令中封装了一些DOM行为&#xff0c;指令可以绑定一些属性值&#xff0c;根据不同的值&#xff0c;框架会进行相关DOM操作的绑定。 它们作用于HTML…...