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

说明和效果

   树的结构示例: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.mzph.cn/news/775514.shtml

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

相关文章

P8649 [蓝桥杯 2017 省 B] k 倍区间:做题笔记

目录 思路 代码思路 代码 推荐 P8649 [蓝桥杯 2017 省 B] k 倍区间 思路 额嗯&#xff0c;这道题我刚上来是想到了前缀和&#xff0c;但是还要判断每个子序列&#xff0c;我就两层for嵌套&#xff0c;暴力解了题。就是我知道暴力肯定过不了但是写不出来其他的[留下了苦…

【ESP32S3 Sense接入语音识别+MiniMax模型对话】

1. 前言 围绕ESP32S3 Sense接入语音识别MiniMax模型对话展开&#xff0c;首先串口输入“1”字符&#xff0c;随后麦克风采集2s声音数据&#xff0c;对接百度在线语音识别&#xff0c;将返回文本结果丢入MiniMax模型&#xff0c;进而返回第二次结果文本&#xff0c;实现语言对话…

Serilog日志框架

文章目录 一. Serilog介绍1.1 安装Serilog1.2 Serilog日志级别 二. Serilog.App项目应用2.1 Serilog一般应用2.2 兼容系统日志 三. Serilog.Web应用3.1 Minimal示例3.2 WebApi示例 参考链接 一. Serilog介绍 Serilog 是 .NET应用程序的诊断日志记录库。它易于设置&#xff0c;…

libVLC 动态视频壁纸

在 Windows 上&#xff0c;你可能需要使用 Windows API 来设置壁纸&#xff0c;而在 Linux 上&#xff0c;你可能需要使用某种桌面环境特有的方法。在 macOS 上&#xff0c;这一功能可能受到限制。 效果图如下所示&#xff1a; 以下是一个简单的示例&#xff0c;说明了如何在 …

Ubuntu16.04 切换系统python和gcc版本

4.切换系统python版本 sudo update-alternatives --config python5.切换系统gcc版本 sudo update-alternatives --config gccubuntu16.04中的gcc版本及版本切换 5.查看opencv版本 pkg-config opencv --modversion查看cuda版本 cat /usr/local/cuda/version.txt或者 nvcc …

[Qt] QString::fromLocal8Bit 的使用误区

QString::fromLocal8Bit 是一个平台相关的函数。默认情况下在 Windows 下 就是 gbk 转 utf-8 ,在 Linux就应该是无事发生。因为Linux平台默认的编码方式就是 utf-8 可以通过 void QTextCodec::setCodecForLocale(QTextCodec *c)来修改 Qt默认的编码方式。如下 第一输出乱码的…

【单调队列单调栈专题】【蓝桥杯备考训练】:矩形牛棚、单调栈、滑动窗口、子矩阵、最大子序和、烽火传递【已更新完成】

目录 1、矩形牛棚&#xff08;usaco training 6.1&#xff09; 思路&#xff1a; 预处理的过程&#xff1a; 判断左右边界的过程&#xff1a; 代码&#xff1a; 2、单调栈&#xff08;单调栈模板&#xff09; 思路&#xff1a; 基本步骤&#xff1a; 1、维护单调性 2、处理要求…

vue组件如何使用?

今天我随便试两个组件 第一个轮播图 在minn.js 引入 import { createApp } from vue; import { Swipe, SwipeItem } from vant; const app createApp(); app.use(Swipe); app.use(SwipeItem); <van-swipe class"my-swipe" :autoplay"3000" indica…

python学习15:python中的input语句

python中的input语句 我们前面学习过print语句&#xff0c;可以将内容输出到屏幕上&#xff1b;在python中&#xff0c;与之对应的还有一个input语句&#xff0c;用来获取键盘输入。 数据输出&#xff1a;print 数据输入&#xff1a;input 使用上也很简单&#xff1a; 使用inp…

jvm高级面试题-2024

说下对JVM内存模型的理解 JVM内存模型主要是指Java虚拟机在运行时所使用的内存结构。它主要包括堆、栈、方法区和程序计数器等部分。 堆是JVM中最大的一块内存区域&#xff0c;用于存储对象实例。一般通过new关键字创建的对象都存放在堆中&#xff0c;堆的大小可以通过启动参数…

http 超全状态码

HTTP&#xff08;超文本传输协议&#xff09;是一种用于传输超文本的应用层协议。在进行HTTP通信时&#xff0c;服务器会向客户端返回一个状态码&#xff0c;用于表示请求的处理结果。 状态码由3位数字组成&#xff0c;使用第1个数字表示响应的类别&#xff0c;一共5种&#x…

广告牌效果的C#实现

前言 这个效果是在以前的项目时候&#xff0c;特效那边想要一个广告牌效果但是我不懂什么是广告牌两个人沟通半天&#xff0c;才把东西做出来。 代码如下 using System.Collections; using System.Collections.Generic; using UnityEditor; using UnityEngine;[ExecuteInEdit…

视图的作用

目录 视图的作用 创建视图 为 scott 分配创建视图的权限 查询视图 复杂视图的创建 视图更新的限制问题 更新视图中数据的部门编号&#xff08;视图的存在条件&#xff09; 限制通过视图修改数据表内容 创建只读的视图 复杂视图创建 oracle从入门到总裁:​​​​​​h…

关于GPT-SoVITS语音合成的效果展示(西游之西天送葬团)

目录 使用效果总结合成效果展示 使用效果总结 使用的是2024年03月21日22点28分更新的版本。 使用起来很方便&#xff0c;从它“自带界面”这点就能看出&#xff0c;易于使用也是目的之一&#xff0c;而且从训练到推理的每个步骤都能在界面中完成。 集成了多个实用工具&#…

快速创建zookeeper集群

先说明&#xff0c;我很穷&#xff01;&#xff01;&#xff0c;开不了多个虚拟机&#xff0c;zookeeper集群的3个节点都放在同一个虚拟机&#xff0c;所以搭建是一个伪集群&#xff0c;因为一个服务器挂机&#xff0c;所有节点都会停止。工作实际情况安装到三个服务器&#xf…

Doris 数据集成 Catalog

Doris 数据集成 Catalog 多源数据目录(Multi-Catalog)功能,旨在能够更方便对接外部数据目录,以增强Doris的数据湖分析和联邦数据查询能力。 在之前的 Doris 版本中,用户数据只有两个层级:Database 和 Table。当我们需要连接一个外部数据目录时,我们只能在Database 或 …

3、RabbitMQ_工作模式

一、简单模式 简介 简单模式 HelloWorld。一个生产者、一个消费者&#xff0c;不需要设置交换机使用默认的交换机。 代码示例 生产者public class Producer {//队列名称private final static String QUEUE_NAME "hello";public static void main(String[] args)…

【Linux】文件查看命令(六)

文章目录 wc 命令grep命令&#xff08;常用&#xff09;more 命令cat 命令less 命令&#xff08;不常用&#xff09;head 命令&#xff08;不常用&#xff09;tail 命令&#xff08;不常用&#xff09; wc 命令 功能描述: wc 命令用于统计文件中的字节数、字数、行数等信息。 …

H5抓包——Android 使用电脑浏览器 DevTools调试WebView

H5抓包——Android 使用电脑浏览器 DevTools调试WebView 一、使用步骤 1、电脑通过数据线连接手机&#xff0c;开启USB调试&#xff08;打开手机开发者选项&#xff09; 2、打开待调试的H5 App&#xff0c;进入H5界面 3、打开电脑浏览器&#xff0c;调试界面入口 如果用ed…

第十一章:位运算符与位运算

文章目录 第十一章&#xff1a;位运算符与位运算1.按位与运算&#xff1a;&2.按位或运算&#xff1a;|3.按位异或运算&#xff1a;^4.取反运算符&#xff1a;~5.左移运算符&#xff1a;<<6.右移运算符&#xff1a;>>总结 第十一章&#xff1a;位运算符与位运算…