Java实现二叉树的图形打印_如何直观形象地树状打印一棵二叉树?

网上绝大部分的二叉树打印效果都十分潦草,也不够直观形象,最近自己用JS写了个图形化小工具BinaryTreeGraph,也用Java写了个打印器BinaryTreePrinter,还有个Objective-C版本BinaryTreePrinterOC

具体代码实现请看github

BinaryTreeGraph(JS版)

bb8b5373be9e4be7adea04c546f5b591.png

59e12f1c4eb63e400731c4fccceec66a.png

09571a8dcae4c5d77e97c9fd20d07921.png

7ba735a98977b1ddf7c363385da389fa.png

2ced61282d4df9ef8289770cf10bf8a2.png

BinaryTreePrinter(Java版)

简介

树状打印一棵二叉树

比如输入一棵二叉搜索树

[381, 12, 410, 9, 40, 394, 540, 35, 190, 476, 760, 146, 445, 600, 800]

就会输出

c6b36744b4aea7e5d1fec11880b0fda5.png

或者输出

4f2164a1b422ac5fc880894b379b8824.png

核心API

public final class BinaryTrees {

// 打印一棵二叉树

public static void print(BinaryTreeInfo tree);

public static void print(BinaryTreeInfo tree, PrintStyle style);

// 打印一棵二叉树(打印完自动换行)

public static void println(BinaryTreeInfo tree);

public static void println(BinaryTreeInfo tree, PrintStyle style);

// 获得一棵二叉树的打印字符串

public static String printString(BinaryTreeInfo tree);

public static String printString(BinaryTreeInfo tree, PrintStyle style);

// 可选的打印样式

public enum PrintStyle {

LEVEL_ORDER,

INORDER

}

}

示例

实现BinaryTreeInfo

根节点是谁?

如何查找左节点?

如何查找右节点?

如何打印单个节点?

/**

* BinarySearchTree是你自己编写的二叉树类

*/

public class BinarySearchTree implements BinaryTreeInfo {

/**这里省略了大量代码,只贴出了脉络代码**/

private Node root;

private static class Node {

E element;

Node left;

Node right;

}

/********** BinaryTreeInfo **********/

@Override

public Object root() {

// 根节点是谁?

return root;

}

@Override

public Object left(Object node) {

// 如何查找左节点?

return ((Node) node).left;

}

@Override

public Object right(Object node) {

// 如何查找右节点?

return ((Node) node).right;

}

@Override

public Object string(Object node) {

// 如何打印单个节点?

return ((Node) node).element;

}

/********** BinaryTreeInfo **********/

}

打印

// 随机生成的一棵二叉搜索树(random generation)

BinarySearchTree bst = ...;

// PrintStyle.LEVEL_ORDER(层序打印)

BinaryTrees.println(bst);

// PrintStyle.INORDER(中序打印)

BinaryTrees.println(bst, PrintStyle.INORDER);

49ce1d1199930f342949e149bc42864d.png

c26e0ba878ca267e61cc8078386f5ad6.png

生成字符串写入文件

Files.writeToFile("F:/test/bst.txt", BinaryTrees.printString(bst));

不需要定义二叉树类

BinaryTrees.println(new BinaryTreeInfo() {

@Override

public Object root() {

return 8;

}

@Override

public Object left(Object node) {

if (node.equals(8)) return 3;

if (node.equals(3)) return 1;

if (node.equals(6)) return 4;

if (node.equals(14)) return 13;

return null;

}

@Override

public Object right(Object node) {

if (node.equals(8)) return 10;

if (node.equals(10)) return 14;

if (node.equals(3)) return 6;

if (node.equals(6)) return 7;

return null;

}

@Override

public Object string(Object node) {

return node;

}

});

BinaryTrees.println(new BinaryTreeInfo() {

@Override

public Object root() {

return "Life";

}

@Override

public Object left(Object node) {

if (node.equals("Life")) return "Animal";

if (node.equals("Person")) return "Man";

if (node.equals("Animal")) return "Cat";

if (node.equals("Dog")) return "Teddy";

return null;

}

@Override

public Object right(Object node) {

if (node.equals("Life")) return "Person";

if (node.equals("Person")) return "Woman";

if (node.equals("Animal")) return "Dog";

if (node.equals("Dog")) return "SingleDog";

return null;

}

@Override

public Object string(Object node) {

return node;

}

});

3ed07cea52f38dadd0beed578c9d6f5c.png

0dd56141f84a000442751e0ddb3a409f.png

二叉堆

public class BinaryHeap implements BinaryTreeInfo {

private int size;

private E[] elements;

@Override

public Object root() {

return 0;

}

@Override

public Object left(Object node) {

int index = ((int) node << 1) + 1;

return index >= size ? null : index;

}

@Override

public Object right(Object node) {

int index = ((int) node << 1) + 2;

return index >= size ? null : index;

}

@Override

public Object string(Object node) {

return elements[(int) node];

}

}

BinaryHeap heap = new BinaryHeap<>();

for (int i = 0; i < 10; i++) {

heap.add((int) (Math.random() * 100));

}

BinaryTrees.println(heap);

593c78f74f793fd062fd17686eaf95c6.png

BinaryTreePrinterOC

实现MJBinaryTreeInfo协议

@interface MJBSTNode : NSObject {

@public

id _element;

MJBSTNode *_left;

MJBSTNode *_right;

}

@end

@interface MJBinarySearchTree : NSObject

@end

@interface MJBinarySearchTree() {

MJBSTNode *_root;

}

@end

@implementation MJBinarySearchTree

#pragma mark - MJBinaryTreeInfo

- (id)left:(MJBSTNode *)node {

return node->_left;

}

- (id)right:(MJBSTNode *)node {

return node->_right;

}

- (id)string:(MJBSTNode *)node {

return node->_element;

}

- (id)root {

return _root;

}

@end

打印

[MJBinaryTrees println:bst];

[MJBinaryTrees println:bst style:MJPrintStyleLevelOrder];

[MJBinaryTrees println:bst style:MJPrintStyleInorder];

NSString *str = [MJBinaryTrees printString:bst];

NSString *file = @"/Users/mj/Desktop/1.txt";

[str writeToFile:file atomically:YES encoding:NSUTF8StringEncoding error:nil];


版权声明:本文为weixin_35520863原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。