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

2024-02-28 16:04

本文主要是介绍小白水平理解面试经典题目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目录【基础版】
编码道路漫漫,只要先看脚下的路,徐徐前进即可。

这篇关于小白水平理解面试经典题目LeetCode 655. Print Binary Tree【Tree】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


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

相关文章

Java Spring的依赖注入理解及@Autowired用法示例详解

《JavaSpring的依赖注入理解及@Autowired用法示例详解》文章介绍了Spring依赖注入(DI)的概念、三种实现方式(构造器、Setter、字段注入),区分了@Autowired(注入... 目录一、什么是依赖注入(DI)?1. 定义2. 举个例子二、依赖注入的几种方式1. 构造器注入(Con

小白也能轻松上手! 路由器设置优化指南

《小白也能轻松上手!路由器设置优化指南》在日常生活中,我们常常会遇到WiFi网速慢的问题,这主要受到三个方面的影响,首要原因是WiFi产品的配置优化不合理,其次是硬件性能的不足,以及宽带线路本身的质... 在数字化时代,网络已成为生活必需品,追剧、游戏、办公、学习都离不开稳定高速的网络。但很多人面对新路由器

深入理解Go语言中二维切片的使用

《深入理解Go语言中二维切片的使用》本文深入讲解了Go语言中二维切片的概念与应用,用于表示矩阵、表格等二维数据结构,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧... 目录引言二维切片的基本概念定义创建二维切片二维切片的操作访问元素修改元素遍历二维切片二维切片的动态调整追加行动态

从原理到实战深入理解Java 断言assert

《从原理到实战深入理解Java断言assert》本文深入解析Java断言机制,涵盖语法、工作原理、启用方式及与异常的区别,推荐用于开发阶段的条件检查与状态验证,并强调生产环境应使用参数验证工具类替代... 目录深入理解 Java 断言(assert):从原理到实战引言:为什么需要断言?一、断言基础1.1 语

SpringBoot中4种数据水平分片策略

《SpringBoot中4种数据水平分片策略》数据水平分片作为一种水平扩展策略,通过将数据分散到多个物理节点上,有效解决了存储容量和性能瓶颈问题,下面小编就来和大家分享4种数据分片策略吧... 目录一、前言二、哈希分片2.1 原理2.2 SpringBoot实现2.3 优缺点分析2.4 适用场景三、范围分片

基于Python实现一个Windows Tree命令工具

《基于Python实现一个WindowsTree命令工具》今天想要在Windows平台的CMD命令终端窗口中使用像Linux下的tree命令,打印一下目录结构层级树,然而还真有tree命令,但是发现... 目录引言实现代码使用说明可用选项示例用法功能特点添加到环境变量方法一:创建批处理文件并添加到PATH1

Docker安装MySQL镜像的详细步骤(适合新手小白)

《Docker安装MySQL镜像的详细步骤(适合新手小白)》本文详细介绍了如何在Ubuntu环境下使用Docker安装MySQL5.7版本,包括从官网拉取镜像、配置MySQL容器、设置权限及内网部署,... 目录前言安装1.访问docker镜像仓库官网2.找到对应的版本,复制右侧的命令即可3.查看镜像4.启

spring IOC的理解之原理和实现过程

《springIOC的理解之原理和实现过程》:本文主要介绍springIOC的理解之原理和实现过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、IoC 核心概念二、核心原理1. 容器架构2. 核心组件3. 工作流程三、关键实现机制1. Bean生命周期2.

Git可视化管理工具(SourceTree)使用操作大全经典

《Git可视化管理工具(SourceTree)使用操作大全经典》本文详细介绍了SourceTree作为Git可视化管理工具的常用操作,包括连接远程仓库、添加SSH密钥、克隆仓库、设置默认项目目录、代码... 目录前言:连接Gitee or github,获取代码:在SourceTree中添加SSH密钥:Cl

数据库面试必备之MySQL中的乐观锁与悲观锁

《数据库面试必备之MySQL中的乐观锁与悲观锁》:本文主要介绍数据库面试必备之MySQL中乐观锁与悲观锁的相关资料,乐观锁适用于读多写少的场景,通过版本号检查避免冲突,而悲观锁适用于写多读少且对数... 目录一、引言二、乐观锁(一)原理(二)应用场景(三)示例代码三、悲观锁(一)原理(二)应用场景(三)示例