如何直观形象地树状打印一棵二叉树?

网上绝大部分的二叉树打印效果都十分潦草,也不够直观形象,最近自己用Java写了个打印器,可以实现如下效果

  1 BinarySearchTree<Integer> bst1 = bst(new Integer[]{
  2     7, 4, 9, 2, 5, 8, 11, 1, 3, 6, 10, 12
  3 });
  4 printer.treeln(bst1);
  5 /*
  6         7
  7       /     8     4       9
  9    / \     /  10   2   5   8   11
 11  / \   \     /   12 1   3   6   10  12
 13 */
 14
 15 BinarySearchTree<Integer> bst2 = bst(new Integer[]{
 16     381, 12, 410, 9, 40, 394, 540,
 17     35, 190, 476, 760, 146, 445,
 18     600, 800
 19 });
 20 printer.treeln(bst2);
 21 /*
 22         381
 23       /      24   12           410
 25  /  \         /    26 9    40     394   540
 27     /  \         /    28  35    190    476     760
 29       /       /      /    30     146     445    600   800
 31 */
 32
 33 printer.treeln(bst(new Integer[]{
 34     30, 10, 60, 5, 20, 40, 80,
 35     15, 50, 70, 90
 36 }));
 37 /*
 38         30
 39      /       40   10          60
 41  /  \       /     42 5    20   40      80
 43     /       \    /   44   15        50  70  90
 45 */
 46
 47 printer.treeln(new NodeOperation() {
 48     @Override
 49     public Object root() {
 50         return 8;
 51     }
 52
 53     @Override
 54     public Object left(Object node) {
 55         if (node.equals(8)) return 3;
 56         if (node.equals(3)) return 1;
 57         if (node.equals(6)) return 4;
 58         if (node.equals(14)) return 13;
 59         return null;
 60     }
 61
 62     @Override
 63     public Object right(Object node) {
 64         if (node.equals(8)) return 10;
 65         if (node.equals(10)) return 14;
 66         if (node.equals(3)) return 6;
 67         if (node.equals(6)) return 7;
 68         return null;
 69     }
 70
 71     @Override
 72     public Object string(Object node) {
 73         return node;
 74     }
 75 });
 76 /*
 77           8
 78         /    79       3       10
 80      / \         81     1   6       14
 82        / \      /
 83       4   7   13
 84  */
 85
 86 printer.treeln(new NodeOperation() {
 87     @Override
 88     public Object root() {
 89         return "Life";
 90     }
 91
 92     @Override
 93     public Object left(Object node) {
 94         if (node.equals("Life")) return "Animal";
 95         if (node.equals("Person")) return "Man";
 96         if (node.equals("Animal")) return "Cat";
 97         if (node.equals("Dog")) return "Teddy";
 98         return null;
 99     }
100
101     @Override
102     public Object right(Object node) {
103         if (node.equals("Life")) return "Person";
104         if (node.equals("Person")) return "Woman";
105         if (node.equals("Animal")) return "Dog";
106         if (node.equals("Dog")) return "SingleDog";
107         return null;
108     }
109
110     @Override
111     public Object string(Object node) {
112         return node;
113     }
114 });
115 /*
116           Life
117         /      118   Animal        Person
119    /  \         /    120 Cat    Dog    Man    Woman
121      /     122  Teddy   SingleDog
123  */

具体实现请看github:https://github.com/CoderMJLee/BinaryTrees

原文地址:https://www.cnblogs.com/mjios/p/10627606.html

时间: 2024-10-20 18:36:27

如何直观形象地树状打印一棵二叉树?的相关文章

二叉树 的先序 中序、后序遍历、层次遍历以及树状打印等操作

#include <stdio.h> #include <stdlib.h> #define MAXSIZE 50 typedef struct Node { char data; struct Node *LChild; struct Node *RChild; }BiTNode,*BiTree; typedef struct { BiTree element[MAXSIZE]; int front; int rear; }SeqQueue; /*初始化队列*/ void Ini

哈希(2) - 垂直打印一棵二叉树(使用哈希表实现)

垂直打印给定的一棵二叉树.下面的例子演示了垂直遍历的顺序. 1 / 2 3 / \ / 4 5 6 7 \ 8 9 对这棵树的垂直遍历结果为: 4 2 1 5 6 3 8 7 9 在二叉树系列中,已经讨论过了一种O(n2)的方案.在本篇中,将讨论一种基于哈希表的更优的方法.首先在水平方向上检测所有节点到root的距离.如果两个node拥有相同的水平距离(Horizontal Distance,简称HD), 则它们在相同的垂直线上.root自身的HD为0,右侧的node的HD递增,即+1,而左侧的

小代码 二叉树 添加树状打印及倒立打印

  //bug    last line can not swap with n-1 //http://www.zhihu.com/question/22547591/  #include<iostream>  #include<queue> #include <queue>   #include <vector>   #include <list>   #include <math.h>  #include <cstdio&g

哈夫曼树树状输出

1 #include "stdio.h" 2 #include "malloc.h" 3 4 #define maxlen 100 5 #define infinity 65535 6 7 struct bnode 8 { 9 int data;//数据 10 bnode *lchild,*rchild; 11 bool flags;//使用标志 12 }; 13 14 bnode *tree[maxlen]; 15 16 void initialization(i

Java文件目录树状结构:控制台打印某个文件夹下的文件目录树状结构

1 package com.zhen.file; 2 3 import java.io.File; 4 5 /* 6 * 控制台打印某个文件夹下的文件目录树状结构 7 * 递归算法 8 */ 9 10 public class FileTree { 11 12 public static void main(String[] args) { 13 File file =new File("D:/Github/JavaTest"); 14 PrintFile(file, 0); 15 }

JAVA File类 打印目录树状结构图 递归算法

  要实现把制定目录下的所有文件,按照树状结构打印出来的目的. 代码如下: package cn.bjsxt.io; import java.io.File; public class FileTree {        public static void main(String[] args) {                File f=new File("E:/有用的文档"); //假设打印这个目录下的所有文件                printTree(f, 0);

Matrix.(POJ-2155)(树状数组)

一道二维树状数组的题目,比较经典,适合新手练习. 可以打印出来每次操作后矩阵的情况,就能很直观的理解这个树状数组是怎么实现的,他将多余的部分巧妙的重复了偶数次,使得多余部分奇偶不会发生变化. #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<queue> #include<vector> #include<map&

树状数组与差分

目录 树状数组的引入 lowbit的含义 树状数组的前缀和存储方式 单点修改 区间查询 初始化 模板例题--树状数组基本操作 差分--区间修改 备注 @(树状数组算法详解·目录) 树状数组的引入 相信读者一定知道什么是前缀和,形如一串数\(a1,a2...,an,sum[i]=a[1]+a[2]+...+a[i]\) 前缀和在算法的优化上占有很重要的地位,一般就会预先对数据进行预处理运算以后,再在运算过程中用\(O(1)\)时间调用,这样的操作很大程度上避免了实际运算中的枚举,NOIP2016魔

区间素数个数 树状数组 HIT 1867 经理的烦恼

http://acm.hit.edu.cn/hoj/problem/view?id=1867 经理的烦恼   Source : HCPC 2005 Spring   Time limit : 2 sec   Memory limit : 32 M Submitted : 2994, Accepted : 686 Jerry是一家公司销售部门的经理.这家公司有很多连锁店,编号为1,2,3,... Jerry每天必须关注每家连锁店的商品数量及其变化,一项很乏味的工作.在连锁店比较少的时候,Jerry