如何直观的打印一颗二叉树

news/2024/11/23 5:36:35/

如何直观的打印一颗二叉树

打印的结果是需要顺时针旋转90的,如下面的结果打印出来是这样的。
在这里插入图片描述
这里写图片描述

如何打印呢? 需要处理以下四个问题:

  • 遍历树的顺序是 右子树->根->左子树;
  • 因为要避免数字长度影响对齐的因素,所以两边补上空格(有一个总长度可以自己确定);
  • 在结点的两边加上特定的字符串标记区分孩子和父亲以及位置,使用 H^v 这个几个标记
  • 和高度有关系的 height * len, 打印相应前面的空格长度;

代码如下

public class PrintBinaryTree {static class Node{public int value;public Node left;public Node right;public Node(int value) {this.value = value;}}/*** @param head      传入的节点* @param height  层数(根节点为0)* @param to       表示的特定节点  H表示根节点   ^表示父亲节点在左上方 v表示父亲节点在左下方* @param len    指定每一个节点打印的宽度(总宽度)*/static void printTree(Node head,int height,String to,int len){if(head == null)return;printTree(head.right,height + 1,"v",len);  // 递归右子树String val = to + head.value + to;   // 加上两边指示的字符int lenV = val.length();int lenL = (len - lenV)/2;    //  左边的空格  ((总长度-值所占长度),然后分一半)int lenR = len - lenV - lenL; //  右边的空格  (总-值-左边空格长度)System.out.println( getSpace(len * height) + getSpace(lenL) + val + getSpace(lenR)); // len*length是对应的层数对应的空格printTree(head.left,height + 1,"^",len);  // 递归左子树}//获取指定的空格static String getSpace(int len){StringBuffer str = new StringBuffer();for(int i = 0; i < len; i++)str.append(" ");return str.toString();}public static void main(String[] args) {/***              1*            2   3*          4    5 6*            7*/Node head = new Node(1);head.left = new Node(2);head.right = new Node(3);head.left.left = new Node(4);head.right.left = new Node(5);head.right.right = new Node(6);head.left.left.right = new Node(7);printTree(head,0,"H",10);}
}

http://www.ppmy.cn/news/695114.html

相关文章

用数学归纳法证明二叉树的先序遍历序列和中序遍历序列可以唯一确定一颗二叉树

用数学归纳法证明二叉树的先序遍历序列和中序遍历序列可以唯一确定一颗二叉树。 首先说明&#xff1a;思想来自文都考研洪老师。包括逻辑框架的搭建&#xff0c;此篇文章为框架搭建完成后将细节补充完整。 首先&#xff0c;用到的数学的证明思想是第二类数学归纳法&#xff…

gps有几个轨道面_GPS(全球定位系统)的 24 颗卫星的轨道是如何设计的?

谢邀,先稍微补充下背景知识, 任何一颗卫星在设计时,都要考虑六个参数,叫做轨道六根数 两个决定了卫星轨道的形状:1)轨道半长轴,决定了轨道大概多大,或者距离地球有多高;2)偏心率决定了大概多扁,偏心率为0就是圆了 四个决定了卫星轨道的位置:3)轨道倾角,决定了轨道与…

前序遍历和中序遍历唯一确定一颗二叉树

---恢复内容开始--- 问题描述 如果给出了遍历二叉树的前序序列和中序序列,则可以构造出唯一的一颗二叉树。 基本要求 已知一棵二叉树的前序序列和中序序列,试设计完成下列任务的一个算法: (1).构造一颗二叉树 (2).证明构造正确(即分拨儿以前序和中序遍历该树,将得到的…

删除一颗二叉树

package tree;public class DeleteBT {/*** 删除一颗二叉树* param args*/public static TreeNode delete(TreeNode root){if(rootnull) return root;root.left delete(root.left);root.right delete(root.right);return null;}public static void main(String[] args) {Tree…

题目: 打印输出上下左右对称的,第一行一颗星,第二行三颗星,第三行五颗星,第四行七颗星,第五行五颗星,第六行三颗星,第七行一颗星

题目: 打印输出 * *** ***** ******* ***** *** * /* 分析: 前4行,行数1 2 3 4 i空格数3 2 1 0 4-i星数1 3 5 7 2*i-1 后3行,行数1 2 3 i空格数1 2 3 i星数5 3 1 7-2*i*/ class Test14 {public static void main(String[] a…

小明开了一家糖果店。他别出心裁:把水果糖包成4颗一包和7颗一包的两种。糖果不能拆包卖

小明开了一家糖果店。他别出心裁&#xff1a;把水果糖包成4颗一包和7颗一包的两种。糖果不能拆包卖。 小朋友来买糖的时候&#xff0c;他就用这两种包装来组合。当然有些糖果数目是无法组合出来的&#xff0c;比如要买 10 颗糖。 你可以用计算机测试一下&#xff0c;在这种包装…

Python---堆里有16颗豆子,有两个玩家依次取豆

题目&#xff1a; 堆里有 16 颗豆子&#xff0c;有两个玩家&#xff08;假设一个玩家是电脑&#xff09; 。每个玩家都可以从堆中的 16 颗豆子中取出 1 颗&#xff0c;2 颗或者 3 颗豆子。每个玩家在每回合中必须从堆中取出一定数目的豆子。玩家轮流取出豆子&#xff0c;取到最…

给定任何两种遍历序列能否确定唯一一颗二叉树

给定任何两种遍历序列能否确定唯一一颗二叉树 我们知道确定一颗二叉树&#xff0c;必须要确定它的中序遍历&#xff0c;再加上层次遍历&#xff0c;后序遍历&#xff0c;前序遍历三个中间的一种。为什么这样说呢接下来可以验证一下&#xff0c;这里强烈推荐一下生成二叉树的网…