当前位置: 首页 > news >正文

树状打印二叉树的类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);

相关文章:

  • 二叉树的遍历及线索二叉树试题解析
  • 让手机平板成为AI开发利器:AidLux
  • liunx之nginx安装
  • 区块链与智能合约
  • 详细安装步骤:vue.js 三种方式安装(vue-cli)
  • Java之旅:从零到英雄的编程探索
  • ChimeraX - 命令 morph 动态显示多组 PDB 坐标 模拟 MD 状态
  • MNN介绍、安装和编译
  • C++经典面试题目(七)
  • 让浏览器秒变临时记事本
  • 因果推断学习
  • 循序渐进丨MogDB 对 Oracle DBLink兼容性增强
  • GPU从虚拟化迈向池化:趋动OrionX产品的创新之路
  • 安全点安全区的通俗理解
  • 【C语言】strcmp 的使⽤和模拟实现
  • 【挥舞JS】JS实现继承,封装一个extends方法
  • ECMAScript 6 学习之路 ( 四 ) String 字符串扩展
  • es6要点
  • flask接收请求并推入栈
  • java多线程
  • JDK9: 集成 Jshell 和 Maven 项目.
  • LeetCode541. Reverse String II -- 按步长反转字符串
  • Material Design
  • Python学习之路16-使用API
  • vue总结
  • Web设计流程优化:网页效果图设计新思路
  • 从0搭建SpringBoot的HelloWorld -- Java版本
  • 从地狱到天堂,Node 回调向 async/await 转变
  • 开发基于以太坊智能合约的DApp
  • 七牛云 DV OV EV SSL 证书上线,限时折扣低至 6.75 折!
  • 前端_面试
  • 实现菜单下拉伸展折叠效果demo
  • 项目实战-Api的解决方案
  • 一个SAP顾问在美国的这些年
  • 终端用户监控:真实用户监控还是模拟监控?
  • 你对linux中grep命令知道多少?
  • Spring Batch JSON 支持
  • 资深实践篇 | 基于Kubernetes 1.61的Kubernetes Scheduler 调度详解 ...
  • ​比特币大跌的 2 个原因
  • (0)Nginx 功能特性
  • (1)STL算法之遍历容器
  • (2020)Java后端开发----(面试题和笔试题)
  • (Arcgis)Python编程批量将HDF5文件转换为TIFF格式并应用地理转换和投影信息
  • (C#)Windows Shell 外壳编程系列9 - QueryInfo 扩展提示
  • (C语言)编写程序将一个4×4的数组进行顺时针旋转90度后输出。
  • (echarts)echarts使用时重新加载数据之前的数据存留在图上的问题
  • (力扣)循环队列的实现与详解(C语言)
  • (十七)devops持续集成开发——使用jenkins流水线pipeline方式发布一个微服务项目
  • (四)Tiki-taka算法(TTA)求解无人机三维路径规划研究(MATLAB)
  • (太强大了) - Linux 性能监控、测试、优化工具
  • (转)如何上传第三方jar包至Maven私服让maven项目可以使用第三方jar包
  • .NET Core日志内容详解,详解不同日志级别的区别和有关日志记录的实用工具和第三方库详解与示例
  • .net Stream篇(六)
  • .NET 除了用 Task 之外,如何自己写一个可以 await 的对象?
  • .NET 的程序集加载上下文