树状打印二叉树的类Java、Go、PHP

news/2024/4/28 18:20:47/文章来源:https://blog.csdn.net/weixin_37991016/article/details/137088542

说明和效果

   树的结构示例:1/   \2       3/ \     / \4   5   6   7

树状打印二叉树Java代码

  static class TreeNode {int val = 0;TreeNode left = null;TreeNode right = null;public TreeNode(int val) {this.val = val;}}//打印二叉树的类// TreeOperation.javastatic class TreeNodeShow {/*树的结构示例:1/   \2       3/ \     / \4   5   6   7*/// 用于获得树的层数public static int getTreeDepth(TreeNode root) {return root == null ? 0 : (1 + Math.max(getTreeDepth(root.left), getTreeDepth(root.right)));}private static void writeArray(TreeNode currNode, int rowIndex, int columnIndex, String[][] res, int treeDepth) {// 保证输入的树不为空if (currNode == null) return;// 先将当前节点保存到二维数组中res[rowIndex][columnIndex] = String.valueOf(currNode.val);// 计算当前位于树的第几层int currLevel = ((rowIndex + 1) / 2);// 若到了最后一层,则返回if (currLevel == treeDepth) return;// 计算当前行到下一行,每个元素之间的间隔(下一行的列索引与当前元素的列索引之间的间隔)int gap = treeDepth - currLevel - 1;// 对左儿子进行判断,若有左儿子,则记录相应的"/"与左儿子的值if (currNode.left != null) {res[rowIndex + 1][columnIndex - gap] = "/";writeArray(currNode.left, rowIndex + 2, columnIndex - gap * 2, res, treeDepth);}// 对右儿子进行判断,若有右儿子,则记录相应的"\"与右儿子的值if (currNode.right != null) {res[rowIndex + 1][columnIndex + gap] = "\\";writeArray(currNode.right, rowIndex + 2, columnIndex + gap * 2, res, treeDepth);}}public static void show(TreeNode root) {if (root == null) System.out.println("EMPTY!");// 得到树的深度int treeDepth = getTreeDepth(root);// 最后一行的宽度为2的(n - 1)次方乘3,再加1// 作为整个二维数组的宽度int arrayHeight = treeDepth * 2 - 1;int arrayWidth = (2 << (treeDepth - 2)) * 3 + 1;// 用一个字符串数组来存储每个位置应显示的元素String[][] res = new String[arrayHeight][arrayWidth];// 对数组进行初始化,默认为一个空格for (int i = 0; i < arrayHeight; i++) {for (int j = 0; j < arrayWidth; j++) {res[i][j] = " ";}}// 从根节点开始,递归处理整个树// res[0][(arrayWidth + 1)/ 2] = (char)(root.val + '0');writeArray(root, 0, arrayWidth / 2, res, treeDepth);// 此时,已经将所有需要显示的元素储存到了二维数组中,将其拼接并打印即可for (String[] line : res) {StringBuilder sb = new StringBuilder();for (int i = 0; i < line.length; i++) {sb.append(line[i]);if (line[i].length() > 1 && i <= line.length - 1) {i += line[i].length() > 4 ? 2 : line[i].length() - 1;}}System.out.println(sb.toString());}}
}

使用例子:
TreeNodeShow.show(new TreeNode(1));

树状打印二叉树Go代码

type TreeNode struct {Val   intLeft  *TreeNodeRight *TreeNode
}//打印二叉树的类
// TreeOperation.javatype TreeNodeShow struct {
}func (ts TreeNodeShow) getTreeDepth(root *TreeNode) int {if root == nil {return 0}L := ts.getTreeDepth(root.Left)R := ts.getTreeDepth(root.Right)ans := Lif ans < R {ans = R}return ans + 1
}func (ts TreeNodeShow) writeArray(currNode *TreeNode, rowIndex int, columnIndex int,res [][]string, treeDepth int) {// 保证输入的树不为空if currNode == nil {return}// 先将当前节点保存到二维数组中res[rowIndex][columnIndex] = strconv.Itoa(currNode.Val)// 计算当前位于树的第几层currLevel := ((rowIndex + 1) / 2)// 若到了最后一层,则返回if currLevel == treeDepth {return}// 计算当前行到下一行,每个元素之间的间隔(下一行的列索引与当前元素的列索引之间的间隔)gap := treeDepth - currLevel - 1// 对左儿子进行判断,若有左儿子,则记录相应的"/"与左儿子的值if currNode.Left != nil {res[rowIndex+1][columnIndex-gap] = "/"ts.writeArray(currNode.Left, rowIndex+2, columnIndex-gap*2, res, treeDepth)}// 对右儿子进行判断,若有右儿子,则记录相应的"\"与右儿子的值if currNode.Right != nil {res[rowIndex+1][columnIndex+gap] = "\\"ts.writeArray(currNode.Right, rowIndex+2, columnIndex+gap*2, res, treeDepth)}
}func (ts TreeNodeShow) show(root *TreeNode) {if root == nil {fmt.Println("EMPTY!")}// 得到树的深度treeDepth := ts.getTreeDepth(root)// 最后一行的宽度为2的(n - 1)次方乘3,再加1// 作为整个二维数组的宽度arrayHeight := treeDepth*2 - 1arrayWidth := (2<<(treeDepth-2))*3 + 1// 用一个字符串数组来存储每个位置应显示的元素res := make([][]string, arrayHeight)for x := 0; x < arrayHeight; x++ {res[x] = make([]string, arrayWidth)}// 对数组进行初始化,默认为一个空格for i := 0; i < arrayHeight; i++ {for j := 0; j < arrayWidth; j++ {res[i][j] = " "}}// 从根节点开始,递归处理整个树// res[0][(arrayWidth + 1)/ 2] = (char)(root.val + '0');ts.writeArray(root, 0, arrayWidth/2, res, treeDepth)// 此时,已经将所有需要显示的元素储存到了二维数组中,将其拼接并打印即可//for (String[] line : res) {for _, line := range res {sb := ""for i := 0; i < len(line); i++ {sb = sb + line[i]if len(line[i]) > 1 && i <= len(line)-1 {//i += line[i].length() > 4 ? 2 : line[i].length() - 1;if len(line[i]) > 4 {i = i + 2} else {i = len(line[i]) - 1}//i =i+ len(line[i]) > 4 ? 2 : len(line[i]) - 1;}}fmt.Println(sb)}}

使用:

TreeNodeShow.show(new TreeNode(1));

使用

node1 := TreeNode{1, nil, nil}
node1.Left = &TreeNode{2, nil, nil}
node1.Left.Left = &TreeNode{3, nil, nil}node1.Right = &TreeNode{5, nil, nil}
node1.Right.Left = &TreeNode{4, nil, nil}
node1.Right.Right = &TreeNode{6, nil, nil}
ts := TreeNodeShow{}
ts.show(&node1)

树状打印二叉树PHP代码

   class TreeNode{var $val;var $left = NULL;var $right = NULL;function __construct($val){$this->val = $val;}
}//PHP打印二叉树的类
// TreeOperation.java
class TreeNodeShow {/*树的结构示例:1/   \2       3/ \     / \4   5   6   7*/// 用于获得树的层数public static function getTreeDepth($root) {if($root ==null) return 0;$deepLeft = self::getTreeDepth($root->left);$deepRight = self::getTreeDepth($root->right);$max = $deepLeft;if($max < $deepRight){$max = $deepRight;}return  1 + $max;}private static function writeArray($currNode, $rowIndex, $columnIndex, &$res, $treeDepth) {// 保证输入的树不为空if ($currNode == null) return;// 先将当前节点保存到二维数组中$res[$rowIndex][$columnIndex] = $currNode->val;// 计算当前位于树的第几层$currLevel = intval(($rowIndex + 1) / 2);// 若到了最后一层,则返回if ($currLevel == $treeDepth) return;// 计算当前行到下一行,每个元素之间的间隔(下一行的列索引与当前元素的列索引之间的间隔)$gap = $treeDepth - $currLevel - 1;// 对左儿子进行判断,若有左儿子,则记录相应的"/"与左儿子的值if ($currNode ->left != null) {$res[$rowIndex + 1][$columnIndex - $gap] = "/";self::  writeArray($currNode -> left, $rowIndex + 2, $columnIndex - $gap * 2, $res, $treeDepth);}// 对右儿子进行判断,若有右儿子,则记录相应的"\"与右儿子的值if ($currNode -> right != null) {$res[$rowIndex + 1][$columnIndex + $gap] = "\\";self::writeArray($currNode->right, $rowIndex + 2, $columnIndex + $gap * 2, $res, $treeDepth);}}public static function show($root) {if ($root == null) echo "EMPTY!".PHP_EOL;// 得到树的深度$treeDepth = self:: getTreeDepth($root);// 最后一行的宽度为2的(n - 1)次方乘3,再加1// 作为整个二维数组的宽度$arrayHeight = $treeDepth * 2 - 1;$arrayWidth = (2 << ($treeDepth - 2)) * 3 + 1;// 用一个字符串数组来存储每个位置应显示的元素$res = array();// 对数组进行初始化,默认为一个空格for ($i = 0; $i < $arrayHeight; $i++) {for ($j = 0; $j < $arrayWidth; $j++) {$res[$i][$j] = " ";}}// 从根节点开始,递归处理整个树// res[0][(arrayWidth + 1)/ 2] = (char)(root.val + '0');self:: writeArray($root, 0, intval($arrayWidth / 2), $res, $treeDepth);// 此时,已经将所有需要显示的元素储存到了二维数组中,将其拼接并打印即可/**  for (String[] line : res) {StringBuilder sb = new StringBuilder();for (int i = 0; i < line.length; i++) {sb.append(line[i]);if (line[i].length() > 1 && i <= line.length - 1) {i += line[i].length() > 4 ? 2 : line[i].length() - 1;}}System.out.println(sb.toString());}*/for ($x=0;$x<count($res);$x++ ) {$sb = '';$line = $res[$x];if(gettype($line) =='NULL') continue;if(gettype($line) ==NULL) continue;//var_dump('长度:'.count($line).'  类型:'.(gettype($line)));for ($i = 0; $i < count($line); $i++) {$sb.=$line[$i];if (strlen($line[$i]) > 1 && $i <= count($line) - 1) {$i .= strlen($line[$i]) > 4 ? 2 : strlen($line[$i]) - 1;}}echo $sb.PHP_EOL;}}}使用:
$node1 = new TreeNode(1);
$node1->left = new TreeNode(2);
$node1->left->left = new TreeNode(3);
$node1->right = new TreeNode(5);
$node1->right->left= new TreeNode(4);
$node1->right->right= new TreeNode(6);TreeNodeShow::show($node1);

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

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[NLP] 初窥000001

NL(natural language)–自然语言 人类的语言–中文&#xff0c;英语&#xff0c;法语 NLP(Natural Language Processing)–自认语言处理 计算机处理人类语言的技术&#xff0c;它包含翻译、智能问答、文本分类、情感分析等常见应用。 CV(Computational Vision) 感知NLP 认知…

【Java程序设计】【C00388】基于(JavaWeb)Springboot的校园竞赛管理系统(有论文)

Springboot的校园竞赛管理系统&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 博主介绍&#xff1a;java高级开发&#xff0c;从事互联网行业六年&#xff0c;已经做了六年的毕业设计程序开发&#xff0c;开发过上千套毕业设计程序&#xff0c;博客…

2024/3/27打卡更小的数(十四届蓝桥杯)——区间DP

目录 题目 思路 代码 题目 思路 题目说求数组某个区间中的数进行翻转&#xff0c;由于区间选择多&#xff0c;首先想到DP问题。 第一版想到的方法&#xff08;错误的&#xff09;&#xff0c;当进行状态计算的时候&#xff0c;无法判定区间是否翻转后满足要求&#xff0c;…

js改变图片曝光度(高亮度)

方法一&#xff1a; 原理&#xff1a; 使用canvas进行滤镜操作&#xff0c;通过改变图片数据每个像素点的RGB值来提高图片亮度。 缺点 当前项目使用的是svg&#xff0c;而不是canvas 调整出来的效果不是很好&#xff0c;图片不是高亮&#xff0c;而是有些发白 效果 代码 …

阿里云ECS选型推荐配置

本文介绍构建Kubernetes集群时该如何选择ECS类型以及选型的注意事项。 集群规格规划 目前在创建Kubernetes集群时&#xff0c;存在着使用很多小规格ECS的现象&#xff0c;这样做有以下弊端&#xff1a; 网络问题&#xff1a;小规格Worker ECS的网络资源受限。 容量问题&…

验证码/数组元素的复制.java

1&#xff0c;验证码 题目&#xff1a;定义方法实现随机产生一个5位的验证码&#xff0c;前面四位是大写或小写的英文字母&#xff0c;最后一位是数字 分析&#xff1a;定义一个包含所有大小写字母的数组&#xff0c;然后对数组随机抽取4个索引&#xff0c;将索引对应的字符拼…

iperf网络性能测试工具

iperf命令是一个网络性能测试工具&#xff0c;可以测试TCP和UDP带宽质量。同时也可以通过UDP测试报告网丢包率或者发包性能&#xff0c;是一个非常实用的工具 iperf安装&#xff1a; 可以直接通过官网下载对应系统版本进行安装&#xff08;https://iperf.fr/iperf-download.p…

前端框架前置课(1)---AJAX阶段

1. AJAX入门 1.1 AJAX概念和axios使用 1.1.1 什么是AJAX? 1.1.2 怎么用AJAX? 引入axios.js 获取省份列表数据 1.2 认识URL 1.3 URL查询参数 1.4 常用请求方和数据提交 1.5 HTTP协议-报文 1.5.1 HTTP响应状态码 1.5.1.1 状态码&#xff1a;1XX&#xff08;信息&#xff09…

Java微服务分布式分库分表ShardingSphere - ShardingSphere-JDBC

&#x1f339;作者主页&#xff1a;青花锁 &#x1f339;简介&#xff1a;Java领域优质创作者&#x1f3c6;、Java微服务架构公号作者&#x1f604; &#x1f339;简历模板、学习资料、面试题库、技术互助 &#x1f339;文末获取联系方式 &#x1f4dd; 往期热门专栏回顾 专栏…

JetBrains全家桶激活,分享 WebStorm 2024 激活的方案

大家好&#xff0c;欢迎来到金榜探云手&#xff01; WebStorm公司简介 JetBrains 是一家专注于开发工具的软件公司&#xff0c;总部位于捷克。他们以提供强大的集成开发环境&#xff08;IDE&#xff09;而闻名&#xff0c;如 IntelliJ IDEA、PyCharm、和 WebStorm等。这些工具…

固态硬盘数据恢复难度为何大 固态硬盘数据丢失如何恢复 数据恢复软件

随着时代不断的发展&#xff0c;我们办公工作的内容不断增大&#xff0c;固态硬盘已经成为很多人不可缺少的电脑存储设备。固态硬盘与机械硬盘相比较而言&#xff0c;固态硬盘具备读写速度更快、能耗更低、耐用性更好的优点。虽然固态硬盘优点较多&#xff0c;但是固态硬盘也会…

关于使用TCP-S7协议读写西门子PLC字符串的问题

我们可以使用TCP-S7协议读写西门子PLC&#xff0c; 比如PLC中定义一个String[50] 的地址DB300.20 地址DB300.20 DB块编号为300&#xff0c;偏移量【地址】是30 S7协议是西门子PLC自定义的协议&#xff0c;默认端口102&#xff0c;本质仍然是TCP协议的一种具体实现&#xff…

01-DBA自学课-安装部署MySQL

一、安装包下载 1&#xff0c;登录官网 MySQL :: MySQL Downloads 2&#xff0c;点击社区版下载 3&#xff0c;找到社区服务版 4&#xff0c;点击“档案”Archives 就是找到历史版本&#xff1b; 5&#xff0c;选择版本进行下载 本次学习&#xff0c;我们使用MySQL-8.0.26版本…

将Git LFS大文件转换为普通文件

Git LFS&#xff08;Large File Storage&#xff09;常用于大文件的管理&#xff0c;比如大型的预训练模型、数据集等内容&#xff0c;由于GitHub对上传文件大小的限制&#xff0c;太大的文件一般使用LFS格式上传 将GitHub、Hugging Face等网站上的LFS格式的大文件转换为普通文…

深度学习语义分割篇——DeepLabV1原理详解篇

&#x1f34a;作者简介&#xff1a;秃头小苏&#xff0c;致力于用最通俗的语言描述问题 &#x1f34a;专栏推荐&#xff1a;深度学习网络原理与实战 &#x1f34a;近期目标&#xff1a;写好专栏的每一篇文章 &#x1f34a;支持小苏&#xff1a;点赞&#x1f44d;&#x1f3fc;、…

ssm小区车库停车系统开发mysql数据库web结构java编程计算机网页源码eclipse项目

一、源码特点 ssm小区车库停车系统是一套完善的信息系统&#xff0c;结合springMVC框架完成本系统&#xff0c;对理解JSP java编程开发语言有帮助系统采用SSM框架&#xff08;MVC模式开发&#xff09;&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模…

Excel 导入指定分隔符的 csv 文件

原文&#xff1a;https://blog.iyatt.com/?p14373 基于 Excel 2024 预览版测试 csv 文件本身是纯文本的&#xff0c;同行数据之间通过一定的分隔符打断识别为不同的列&#xff0c;常用的分隔符是英文逗号&#xff0c;使用逗号分隔符的 csv 文件直接用 Excel 打开能正常识别单…

python之(19)CPU性能分析常见工具

Python之(19)CPU性能分析常见工具 Author: Once Day Date: 2024年3月24日 一位热衷于Linux学习和开发的菜鸟&#xff0c;试图谱写一场冒险之旅&#xff0c;也许终点只是一场白日梦… 漫漫长路&#xff0c;有人对你微笑过嘛… 全系列文章可参考专栏:Python开发_Once-Day的博客…

迁移android studio 模拟器位置

android studio 初始位置是安装在c盘&#xff0c;若是要迁移需 1创建一个目标位置如我的F:/avd 2在系统环境变量里面设置新的地址 变量名&#xff1a;ANDROID_SDK_HOME 变量值&#xff1a;F:/avd 3最重要的是文件复制&#xff0c;将C盘里面avd的上层目录.android的目录整体…

机器学习——聚类算法-层次聚类算法

机器学习——聚类算法-层次聚类算法 在机器学习中&#xff0c;聚类是一种将数据集划分为具有相似特征的组或簇的无监督学习方法。聚类算法有许多种&#xff0c;其中一种常用的算法是层次聚类算法。本文将介绍聚类问题、层次聚类算法的原理、算法流程以及用Python实现层次聚类算…