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

按照推论结果:
- 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选项保存,最后关闭在这台电脑上同步设置保存就好了。接下来…...
Zustand 状态管理库:极简而强大的解决方案
Zustand 是一个轻量级、快速和可扩展的状态管理库,特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...
【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力
引言: 在人工智能快速发展的浪潮中,快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型(LLM)。该模型代表着该领域的重大突破,通过独特方式融合思考与非思考…...
三体问题详解
从物理学角度,三体问题之所以不稳定,是因为三个天体在万有引力作用下相互作用,形成一个非线性耦合系统。我们可以从牛顿经典力学出发,列出具体的运动方程,并说明为何这个系统本质上是混沌的,无法得到一般解…...
多模态大语言模型arxiv论文略读(108)
CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题:CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者:Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...
【开发技术】.Net使用FFmpeg视频特定帧上绘制内容
目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法,当前调用一个医疗行业的AI识别算法后返回…...
学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”
2025年#高考 将在近日拉开帷幕,#AI 监考一度冲上热搜。当AI深度融入高考,#时间同步 不再是辅助功能,而是决定AI监考系统成败的“生命线”。 AI亮相2025高考,40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕,江西、…...
使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度
文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...
Java + Spring Boot + Mybatis 实现批量插入
在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法:使用 MyBatis 的 <foreach> 标签和批处理模式(ExecutorType.BATCH)。 方法一:使用 XML 的 <foreach> 标签ÿ…...
代码规范和架构【立芯理论一】(2025.06.08)
1、代码规范的目标 代码简洁精炼、美观,可持续性好高效率高复用,可移植性好高内聚,低耦合没有冗余规范性,代码有规可循,可以看出自己当时的思考过程特殊排版,特殊语法,特殊指令,必须…...
解决:Android studio 编译后报错\app\src\main\cpp\CMakeLists.txt‘ to exist
现象: android studio报错: [CXX1409] D:\GitLab\xxxxx\app.cxx\Debug\3f3w4y1i\arm64-v8a\android_gradle_build.json : expected buildFiles file ‘D:\GitLab\xxxxx\app\src\main\cpp\CMakeLists.txt’ to exist 解决: 不要动CMakeLists.…...
