给你一棵二叉树的根节点 root ,请你构造一个下标从 0 开始、大小为 m x n 的字符串矩阵 res ,用以表示树的 格式化布局 。构造此格式化布局矩阵需要遵循以下规则:
返回构造得到的矩阵 res 。
示例 1:
输入:root = [11,12,13,null,14]
输出:
[["","","","11","","",""],
["","12","","","","13",""],
["","","14","","","",""]]
这道题主要是如何层序遍历二叉树,并且按照要求排列数字;
如图:
将原来的树可以按照上述图示进行转换,这里我使用Integer.MIN_VALUE表示null;并且定义成 int none = Integer.MIN_VALUE;
第一步,使用BFS做层序遍历,最终遍历结果,[11], [12,13],[none,14,none,none];
第二步,计算每层的长度,上述总共3层,最后一层在每个元素中间需要使用空字符串填充,那么就是:元素数量 * 2 - 1;根据二叉树的性质:最后一层元素数量=(int) Math.pow(2, res.size()-1);最终换算成:(int) Math.pow(2, res.size()) - 1;
第三步,每一层需要填充空字符,参考下图:
如果是三层,效果如下:
如果是四层,效果如下:
最终效果如下:
总共4层:
第4层间隔:2的(4-4)次方 - 1 = 0
第3层间隔:2的(4-3)次方 - 1 = 1
第2层间隔:2的(4-2)次方 - 1 = 3
第1层间隔: 2的(4-1)次方 - 1 = 7
for (int i = 0; i < res.size(); i++) { Listl = new ArrayList<>(size); r.add(l); List list = res.get(i); int v = (int) Math.pow(2, res.size()-i-1) - 1; for(int j=0;j
-
- import org.example.TreeNode;
-
- import java.util.ArrayList;
- import java.util.Deque;
- import java.util.LinkedList;
- import java.util.List;
-
- class Solution1 {
-
- int none = Integer.MIN_VALUE;
-
- public List
> printTree(TreeNode root) {
-
- List
> res = new ArrayList<>();
-
- Deque
deque = new LinkedList<>(); - if (root != null) {
- deque.offer(root);
- }
-
- int countNotNull = deque.size();
- while (countNotNull != 0) {
- int sz = deque.size();
- List
list = new ArrayList<>(); - countNotNull = 0;
- for (int i = 0; i < sz; i++) {
- TreeNode node = deque.poll();
- list.add((node.val));
- if (node.left != null) {
- deque.offer(node.left);
- countNotNull++;
- } else {
- deque.offer(new TreeNode(none));
- }
- if (node.right != null) {
- deque.offer(node.right);
- countNotNull++;
- } else {
- deque.offer(new TreeNode(none));
- }
- }
- res.add(list);
- }
-
-
- List
> r = new ArrayList<>(res.size());
- int size = (int) Math.pow(2, res.size()) - 1;
-
- for (int i = 0; i < res.size(); i++) {
- List
l = new ArrayList<>(size); - r.add(l);
-
- List
list = res.get(i); -
- int v = (int) Math.pow(2, res.size()-i-1) - 1;
-
- for(int j=0;j
-
- // before
- for(int m=0;m
- l.add("");
- }
- if(list.get(j) != none) {
- l.add(String.valueOf(list.get(j)));
- } else {
- l.add("");
- }
- // after
- for(int m=0;m
- l.add("");
- }
-
- if(j != list.size()-1) {
- l.add("");
- }
- }
-
- }
-
- return r;
- }
-
- public static void main(String[] args) {
- Solution1 solution = new Solution1();
- TreeNode root = new TreeNode(1);
- root.left = new TreeNode(2);
- root.right = new TreeNode(3);
- root.left.right = new TreeNode(4);
- System.out.println(solution.printTree(root));
- }
- }
总结
这道题就是二叉树的层序遍历+完全二叉树的特点的题目,感觉更像一个数学题目,先找到规律,然后用代码完成数据展示。欢迎有更高效、更简洁的思路回复。
-
相关阅读:
带你深入了解什么是 Java 线程池技术
JAVA 开发pc端桌面软件 基于idea+javafx+maven+springboot
VUE启动报错:Error: The project seems to require pnpm but it‘s not installed
R语言ggplot2可视化:gganimate包基于transition_time函数创建动态散点图动画(gif)
汽车信息安全--如何理解TrustZone(1)
Unity3D将比较简单的字典结构封装为json
Mybatis 实现简单增删改查
运算方法和运算器
加解密随笔
【python】爬取杭州市二手房销售数据做数据分析【附源码】
-
原文地址:https://blog.csdn.net/weiliuhong1/article/details/126474744
-
最新文章
-
C++11 线程同步接口std::condition_variable和std::future的简单使用
Go runtime 调度器精讲(十一):总览全局
Spring框架漏洞总结
Angular 18+ 高级教程 – 国际化 Internationalization i18n
基于Tauri2+Vue3搭建桌面端程序|tauri2+vite5多窗口|消息提醒|托盘闪烁
ComfyUI 基础教程(五) —— 应用 IP-Adapter 实现图像风格迁移
网络空间的“边水往事”?针对华语黑产及用户进行攻击的 APT-K-UN3 活动分析
伪装“黑神话悟空修改器”传播木马的活动分析
全球蓝屏后,微软决定将安全踢出Windows内核
Java读取寄存器数据的方法