小白水平理解面试经典题目LeetCode 655. Print Binary Tree【Tree】

655 打印二叉树

一、小白翻译

给定二叉树的 root ,构造一个 0 索引的 m x n 字符串矩阵 res 来表示树的格式化布局。格式化布局矩阵应使用以下规则构建:

  • 树的高度为 height ,行数 m 应等于 height + 1 。

  • 列数 n 应等于​​xheight+1​​ - 1 。

  • 将根节点放置在顶行的中间(更正式地说,位于位置 res[0][(n-1)/2] )。

  • 对于已放置在矩阵中位置 res[r][c] 的每个节点,将其左子节点放置在 res[r+1][c-2height-r-1] 处,将其右子节点放置在 res[r+1][c+2height-r-1] 处。

  • 继续此过程,直到树中的所有节点都已放置完毕。

  • 任何空单元格都应包含空字符串 “” 。

返回构造的矩阵 res 。

二、例子

在这里插入图片描述
在这里插入图片描述
限制条件
在这里插入图片描述

这里是小白理解

这种题目我们首先把他进行下条件梳理
这时候黑长直女神过来问:小白,你这题怎么思考的啊?
小白内心镇定:小美,马上春天了,有机会一起去公园出大片吧?
在这里插入图片描述
哦,不是,这道题咱们可以考虑下用递归算法 + 画图来辅助做题
这里我拿一个三层的树进行举例子。
在这里插入图片描述
我们如果在这样画出来就更加直观的看出来每个值的位置。
[
 [“”, “”, “”, “1”, “”, “”, “”],
 [“”, “2”, “”, “”, “”, “3”, “”],
 [“4”, “”, “5”, “”, “”, “”, “”]
]

  • 首先,我们需要计算出二叉树的高度,以便确定矩阵的行数。
  • 然后,我们可以根据高度计算出矩阵的列数,即 2height-1
  • 接下来,我们可以使用递归的方法来遍历二叉树,并将每个节点的值填充到矩阵中。
  • 在递归过程中,我们需要根据当前节点的位置来计算其在矩阵中的行列号。
  • 对于每个节点,我们需要将其值填充到矩阵中,并将其左右子树分别递归地打印到矩阵的左右两部分。

小美:小伙子,可以啊,这不仅逻辑感人,阅读理解也有俩下子, 不过要是照的不美可有你好看了!

小白:没问题,谁叫为了“真爱”呢。

在这里插入图片描述

真正面试环节

面试官:你可以解答这道”融合链表“的题目吗,来看看你对二叉树结构的理解。

小白:嘿嘿,这不巧了么这不是

在这里插入图片描述

    public List<List<String>> printTree(TreeNode root) {int height = getHeight(root); // 树的高度int width = (1 << height) - 1; // 总的列数List<List<String>> res = new ArrayList<>();// 给出整个矩阵for (int i = 0; i < height; i++) {List<String> row = new ArrayList<>();for (int j = 0; j < width; j++) {row.add("");}res.add(row);}printTree(root, res, 0, 0, width - 1);return res;}// 算出树高度private int getHeight(TreeNode root) {if (root == null) {return 0;}return Math.max(getHeight(root.left), getHeight(root.right)) + 1;}private void printTree(TreeNode root, List<List<String>> res, int row, int start, int end) {if (root == null) {return;}int mid = (start + end) / 2;res.get(row).set(mid, String.valueOf(root.val));// 对左侧子树进行计算printTree(root.left, res, row + 1, start, mid - 1);// 对右侧子树进行计算printTree(root.right, res, row + 1, mid + 1, end);}

这里的宽度采用了位运算

为了不熟悉位运算的,这里用个例子便于大家理解。
1 << 3 代表的意思是 “1的二进制数左移3项”
0001 1000
 1   8

小明:OK,完事儿,等着面试官来表扬自己吧。他肯定会说:小子,你是个好手!工位都给你准备好了,工资你说了算。

面试官:矮油,不错啊,不过你这能不能写个测试啊。

小明OS:今年这个找工市场,人言洛阳花似锦,偏我来时不逢春。。。不是,怎么还让我些test case 啊!
总结

	public static void main(String[] args) {TreeNode root = new TreeNode(1);root.left = new TreeNode(2);root.right = new TreeNode(3);root.left.left = new TreeNode(4);root.left.right = new TreeNode(5);printBinaryTree655 solution = new printBinaryTree655();List<List<String>> res = solution.printTree(root);for (List<String> row : res) {for (String s : row) {System.out.print(s + " ");}System.out.println();}}

小白:您好,面试官,这回可以了吧,我终于可以开心练摄影技术为小美照相了!
在这里插入图片描述

============================================================================
🍀🍀🍀🍀🍀🍀更多算法题解请看 面试数据结构与算法总结分类+leetcode目录【基础版】
编码道路漫漫,只要先看脚下的路,徐徐前进即可。

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

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

相关文章

ROS-Ubuntu 版本相关

ROS-Ubuntu 版本相关&#xff1a;安装指引 年代ROS1版本Ubuntu 版本2014Indigo14.042016Kinetic16.042018Melodic18.042020Noetic20.04 & 22.04 ROS2兼顾了工业使用上的问题。 年代ROS2版本Ubuntu 版本2022Humble20.04 & 22.042023Iron16.04 相关参考&#xff1a; […

Linux/Spectra

Enumeration nmap 第一次扫描发现系统对外开放了22&#xff0c;80和3306端口&#xff0c;端口详细信息如下 22端口运行着ssh&#xff0c;80端口还是http&#xff0c;不过不同的是打开了mysql的3306端口 TCP/80 进入首页&#xff0c;点击链接时&#xff0c;提示域名不能解析&…

【深度学习目标检测】二十一、基于深度学习的葡萄检测系统-含数据集、GUI和源码(python,yolov8)

葡萄检测在农业中具有多方面的意义&#xff0c;具体来说如下&#xff1a; 首先&#xff0c;葡萄检测有助于保障农产品质量安全。通过对葡萄进行质量安全专项监测&#xff0c;可以确保葡萄中的农药残留、重金属等有害物质含量符合标准&#xff0c;从而保障消费者的健康。同时&am…

Ubuntu Mysql Innodb cluster集群搭建+MaxScale负载均衡(读写分离)

Ubuntu系统版本 20.04.3 LTS (Focal Fossa) 、64位系统。 cat /etc/os-release查看Ubuntu系统是32位还是64位 uname -m如果显示“i686”,则表示安装了32位操作系统。如果显示“x86_64”,则表示安装了64位操作系统。 一、安装MySql 参考: https://blog.csdn.net/qq_3712…

Idea安装gideabrowser插件

Idea安装gideabrowser插件 一、安装二、设置教程 一、安装 gideabrowser链接地址 二、设置教程 在人生的舞台上&#xff0c;奋力拼搏&#xff0c;才能演绎出最精彩的人生之歌。面对挑战和困难&#xff0c;不妥协、不气馁&#xff0c;只争朝夕&#xff0c;方显坚韧与智慧。努…

10.题号:编号3227 找到最多的数

题目&#xff1a; ###本题考察map和枚举 #include<bits/stdc.h> using namespace std; map<int,int> mp; int main(){int n,m;cin>>n>>m;for(int i1;i<m*n;i){int x;cin>>x;mp[x];}for(const auto & [x,y] : mp){if(2*y>n*m/2){cout…

【MATLAB】 LMD信号分解+FFT傅里叶频谱变换组合算法

有意向获取代码&#xff0c;请转文末观看代码获取方式~ 展示出图效果 1 LMD分解算法 LMD (Local Mean Decomposition) 分解算法是一种信号分解算法&#xff0c;它可以将一个信号分解成多个局部平滑的成分&#xff0c;并且可以将高频噪声和低频信号有效地分离出来。LMD 分解算…

osi模型,tcp/ip模型(名字由来+各层介绍+中间设备介绍)

目录 网络协议如何分层 引入 osi模型 tcp/ip模型 引入 命名由来 介绍 物理层 数据链路层 网络层 传输层 应用层 中间设备 网络协议如何分层 引入 我们已经知道了网络协议是层状结构,接下来就来了解了解下网络协议如何分层 常见的网络协议分层模型是OSI模型 和 …

应用回归分析:弹性网络回归

弹性网络回归&#xff1a;原理、优势与应用 弹性网络回归&#xff08;Elastic Net Regression&#xff09;是一种广泛使用的线性回归方法&#xff0c;它结合了岭回归&#xff08;Ridge Regression&#xff09;和套索回归&#xff08;Lasso Regression&#xff09;的特点。通过…

【c语言】内存函数

欢迎关注个人主页&#xff1a;逸狼 创造不易&#xff0c;可以点点赞吗~ 如有错误&#xff0c;欢迎指出~ 目录 memcpy函数的使用和模拟实现 memcpy函数的使用 memcpy函数的模拟实现 memmove的使用和模拟实现 memmove的使用 memmove的模拟实现 memset函数的使用 memcmp函数…

深度学习 精选笔记(3)线性神经网络-线性回归

学习参考&#xff1a; 动手学深度学习2.0Deep-Learning-with-TensorFlow-bookpytorchlightning ①如有冒犯、请联系侵删。 ②已写完的笔记文章会不定时一直修订修改(删、改、增)&#xff0c;以达到集多方教程的精华于一文的目的。 ③非常推荐上面&#xff08;学习参考&#x…

【kubernetes】关于k8s集群的资源发布方式(灰度/滚动发布)

目录 一、常见的发布方式 二、详解kubectl陈述式方式做灰度发布&#xff08;金丝雀发布&#xff09; 步骤一&#xff1a;先基于deployment控制器创建pod&#xff0c;然后发布 步骤二&#xff1a;基于命令行灰度发布 步骤三&#xff1a;测试等到版本稳定以后&#xff0c;再完…

排序算法--堆排序

堆排序的时间复杂度是O&#xff08;N*logN&#xff09;&#xff0c;优于选择排序O&#xff08;N^2&#xff09; 一、堆 1.堆的概念&#xff1a;堆一般指的是二叉堆&#xff0c;顾名思义&#xff0c;二叉堆是完全二叉树或者近似完全二 2.堆的性质&#xff1a;①完全二叉树 ②每…

python cookbook内容提炼-第一章数据结构和算法

python cookbook内容提炼 博主打算做一篇python cookbook内容提炼的文章&#xff0c;这篇博客会很实用。 第一章&#xff1a;数据结构和算法 第一章的内容很实用&#xff0c;博主做了一些内容上的提炼&#xff0c;把一些最重要的知识点写在了下面。 下面内容中&#xff0c;…

【论文阅读】基于人工智能目标检测与跟踪技术的过冷流沸腾气泡特征提取

Bubble feature extraction in subcooled flow boiling using AI-based object detection and tracking techniques 基于人工智能目标检测与跟踪技术的过冷流沸腾气泡特征提取 期刊信息&#xff1a;International Journal of Heat and Mass Transfer 2024 级别&#xff1a;EI检…

《opencv实用探索·二十二》支持向量机SVM用法

1、概述 在了解支持向量机SVM用法之前先了解一些概念&#xff1a; &#xff08;1&#xff09;线性可分和线性不可分 如果在一个二维空间有一堆样本&#xff0c;如下图所示&#xff0c;如果能找到一条线把这两类样本分开至线的两侧&#xff0c;那么这个样本集就是线性可分&#…

docker 容器修改端口

一般在运行容器时&#xff0c;我们都会通过参数 -p&#xff08;使用大写的-P参数则会随机选择宿主机的一个端口进行映射&#xff09;来指定宿主机和容器端口的映射&#xff0c;例如 docker run -it -d --name [container-name] -p 8088:80 [image-name]这里是将容器内的80端口…

针对KZG承诺和高效laconic OT的extractable witness encryption

1. 引言 2024年以太坊基金会等成员论文 Extractable Witness Encryption for KZG Commitments and Efficient Laconic OT&#xff0c;开源代码实现见&#xff1a; https://github.com/rot256/research-we-kzg&#xff08;Rust&#xff09; 在该论文中&#xff0c;提供了一种…

R语言数学建模(一)—— 基础知识

R语言数学建模&#xff08;一&#xff09;—— 基础知识 文章目录 R语言数学建模&#xff08;一&#xff09;—— 基础知识前言一、建模软件1.1 软件建模的基础1.2 模型的分类1.3 不同类型模型间的联系1.4 一些术语1.5 建模如何适应数据分析过程 二、Tidyverse基础2.1 tidyvers…

Linux学习笔记11——用户组添加删除

Linux 是多用户多任务操作系统&#xff0c;换句话说&#xff0c;Linux 系统支持多个用户在同一时间内登陆&#xff0c;不同用户可以执行不同的任务&#xff0c;并且互不影响。 例如&#xff0c;某台 Linux 服务器上有 4 个用户&#xff0c;分别是 root、www、ftp 和 mysql&…