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

按照推论结果:
- 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;}}
}
相关文章:
按照层次遍历结果打印完全二叉树
按照层次遍历结果打印完全二叉树 按照推论结果: l 层首个节点位置 2h-l - 1l 层节点间距:2h-l1 - 1 编码实现 public static<E> void print(BinaryTree<E> tree) {List<List<Node<E>>> levelNodeList levelOrderTraver…...
基于SpringBoot的药店管理系统
文章目录 项目介绍主要功能截图:部分代码展示设计总结项目获取方式🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 🍅文末获取源码联系🍅 项目介绍 基于SpringBoot的药店管理系统,java项目…...
Java 泛型深入解析
Java 中的泛型是一种强大的编程特性,允许我们编写更加通用和类型安全的代码。本篇博客将深入探讨 Java 泛型的各个方面,包括泛型类、泛型方法、泛型接口以及泛型通配符。 1. 泛型类 首先,让我们看一个简单的泛型类的例子。在下面的代码中&a…...
Apache Doris (六十): Doris - 物化视图
🏡 个人主页:IT贫道_大数据OLAP体系技术栈,Apache Doris,Clickhouse 技术-CSDN博客 🚩 私聊博主:加入大数据技术讨论群聊,获取更多大数据资料。 🔔 博主个人B栈地址:豹哥教你学编程的个人空间-豹哥教你学编程个人主页-哔哩哔哩视频 目录...
【javaweb】tomcat9.0中的HttpServlet
2023年12月28日,周四晚上 目录 什么是HttpServlet tomcat中的HttpServlet由谁产生 什么是HttpServlet 在Tomcat中,HttpServlet 是 Java Servlet API 中的一个抽象类,用于简化基于HTTP协议的Servlet的开发。HttpServlet 扩展了 GenericServ…...
数据结构学习笔记——查找算法中的树形查找(B树、B+树)
目录 前言一、B树(一)B树的概念(二)B树的性质(三)B树的高度(四)B树的查找(五)B树的插入(六)B树的删除 二、B树(一…...
python包chromadb安装失败总结
1,背景: 最近在学习langchain的课程,里面创建自己的知识库的Retrieval模块中,需要用到向量数据库。 所以按照官方的教程(vectorstores),准备使用chroma的向量数据库。图片来源 2,问…...
机器学习(四) -- 模型评估(2)
系列文章目录 机器学习(一) -- 概述 机器学习(二) -- 数据预处理(1-3) 机器学习(三) -- 特征工程(1-2) 机器学习(四) -- 模型评估…...
泊松分布与二项分布的可加性
泊松分布与二项分布的可加性 泊松分布的可加性 例 : 设 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】约束链接 检查 唯一 主键 外键 排他 排他约束 排他约束是一种数据库约束,用于确保某一列或多个列中的值在每一条记录中都是唯一的。这意味着任何两条记录都不能具有相同的值。 排他约束可以在数据库中创建唯一索引或唯一约束来实现。当尝试插入或更…...
Java重修第一天—学习数组
1. 认识数组 建议1.5倍速学习,并且关闭弹幕。 数组的定义:数组是一个容器,用来存储一批同种类型的数据。 下述图:是生成数字数组和字符串数组。 为什么有了变量还需要定义数组呢?为了解决在某些场景下,变…...
【C#】知识点实践序列之Lock的锁定代码块
大家好,我是全栈小5,欢迎来到《小5讲堂之知识点实践序列》文章。 2024年第1篇文章,此篇文章是C#知识点实践序列之Lock知识点,博主能力有限,理解水平有限,若有不对之处望指正! 本篇验证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缓存击穿、缓存雪崩、缓存穿透
缓存击穿(某个热点key缓存失效) 概念 缓存中没有但数据库中有的数据,假如是热点数据,那key在缓存过期的一刻,同时有大量的请求,这些请求都会击穿到DB,造成瞬时DB请求量大、压力增大和缓存雪崩的…...
【PCB专题】Allegro封装更新焊盘
在PCB封装的绘制中,有时会出现需要更新焊盘的情况。比如在制作封装的过程中发现焊盘做的不对而使用PAD_Designer重新更新了焊盘。 那在PCB中如何更新已经修改过的焊盘呢? 打开封装,选择Tools->Padstack->Refresh... 选择Refresh all …...
ES6之Reflect详解
✨ 专栏介绍 在现代Web开发中,JavaScript已经成为了不可或缺的一部分。它不仅可以为网页增加交互性和动态性,还可以在后端开发中使用Node.js构建高效的服务器端应用程序。作为一种灵活且易学的脚本语言,JavaScript具有广泛的应用场景&#x…...
文件监控-IT安全管理软件
文件监控和IT安全管理软件是用于保护企业数据和网络安全的工具。这些工具可以帮助企业监控文件的变化,防止未经授权的访问和修改,并确保数据的安全性和完整性。 一、具有哪些功能 文件监控软件可以实时监控文件系统的活动,包括文件的创建、修…...
达梦数据库安装超详细教程(小白篇)
文章目录 达梦数据库一、达梦数据库简介二、达梦数据库下载三、达梦数据库安装1. 解压2. 安装 四、初始化数据库五、DM管理工具 达梦数据库 一、达梦数据库简介 达梦数据库管理系统是达梦公司推出的具有完全自主知识产权的高性能数据库管理系统,简称DM。 达梦数…...
复试 || 就业day09(2024.01.04)算法篇
文章目录 前言验证外星语词典在长度 2N 的数组中找出重复 N 次的元素找到小镇的法官查找共用字符数组的相对排序分发饼干分发糖果区间选点(AcWing)最大不相交区间数量(AcWing)无重叠区间关于重写小于号 前言 💫你好,我是辰chen,本文旨在准备考…...
Win10电脑关闭OneDrive自动同步的方法
在Win10电脑操作过程中,用户想要关闭OneDrive的自动同步功能,但不知道具体要怎么操作?首先用户需要打开OneDrive,然后点击关闭默认情况下将文档保存到OneDrive选项保存,最后关闭在这台电脑上同步设置保存就好了。接下来…...
YOLO11 vs YOLOv8 实测对比:在自定义数据集上,精度和速度到底提升了多少?
YOLO11 vs YOLOv8 深度实测:工业场景下的精度与效率抉择 当生产线上的摄像头每秒捕获30帧图像时,算法每增加1%的误检率就意味着每小时可能多出上百次错误警报。这正是我们在某汽车零部件缺陷检测项目中面临的现实挑战——选择YOLOv8还是新发布的YOLO11&a…...
新手也能上手!盘点2026年最受喜爱的的降AIGC网站
轻松降低论文AI率在2026年已不再是难题。以下是2026年最实用、实测提速显著的降AIGC网站推荐,覆盖AI痕迹消除、文本优化、降重处理、学术合规检测等核心场景,助你高效搞定论文难题。 一、全流程王者:一站式搞定论文全链路 这类工具覆盖从选题…...
Python工业网关通信异常?97%的调试失败源于这4个隐蔽配置陷阱(附实时诊断脚本)
第一章:Python工业网关通信异常的典型现象与诊断范式工业现场中,基于Python构建的边缘网关常因协议适配、资源约束或环境干扰出现通信异常。典型现象包括:Modbus TCP连接频繁超时、MQTT订阅后无消息到达、OPC UA会话意外中断、串口数据乱码或…...
终极Emscripten编译缓存策略:加速WebAssembly项目构建的完整指南
终极Emscripten编译缓存策略:加速WebAssembly项目构建的完整指南 【免费下载链接】emscripten Emscripten: An LLVM-to-WebAssembly Compiler 项目地址: https://gitcode.com/gh_mirrors/em/emscripten Emscripten作为一款强大的LLVM-to-WebAssembly编译器&a…...
为什么DownKyi能成为B站视频下载的首选工具?3个让你无法拒绝的理由
为什么DownKyi能成为B站视频下载的首选工具?3个让你无法拒绝的理由 【免费下载链接】downkyi 哔哩下载姬downkyi,哔哩哔哩网站视频下载工具,支持批量下载,支持8K、HDR、杜比视界,提供工具箱(音视频提取、去…...
dynamic-datasource启动优化:JAR包瘦身终极指南
dynamic-datasource启动优化:JAR包瘦身终极指南 【免费下载链接】dynamic-datasource dynamic datasource for springboot 多数据源 动态数据源 主从分离 读写分离 分布式事务 项目地址: https://gitcode.com/gh_mirrors/dy/dynamic-datasource dynamic-dat…...
【OSG学习笔记】Day 17: Shape 与 ShapeDrawable
osg::Shape 与 osg::ShapeDrawable 在 OpenSceneGraph(OSG)三维开发中,除了通过 osg::Geometry 手动构建顶点、索引实现自定义几何体外,OSG 还提供了开箱即用的基础图形封装——osg::Shape 与 osg::ShapeDrawable。 这两个类专门用…...
DownKyi:3分钟掌握B站视频下载的高效方法
DownKyi:3分钟掌握B站视频下载的高效方法 【免费下载链接】downkyi 哔哩下载姬downkyi,哔哩哔哩网站视频下载工具,支持批量下载,支持8K、HDR、杜比视界,提供工具箱(音视频提取、去水印等)。 项…...
手把手调试:如何用Windbg或Linux下工具查看并修改PCIe设备的BAR寄存器?
实战指南:Windows与Linux下PCIe设备BAR寄存器调试全流程 当一块PCIe网卡突然无法被系统识别,或者GPU设备在资源分配时发生冲突,作为驱动工程师的你该如何快速定位问题?本文将带你深入PCIe设备的底层世界,从BDF寻址到B…...
StructBERT模型解析:从Transformer到情感分类的技术演进
StructBERT模型解析:从Transformer到情感分类的技术演进 1. 模型架构深度解析 StructBERT作为Transformer架构的重要演进,在自然语言处理领域展现出了独特的技术优势。这个模型最吸引人的地方在于,它在保持BERT强大语言理解能力的同时&…...
