網上絕大部分的二叉樹列印效果都十分潦草,也不夠直觀形象,最近自己用JS寫了個圖形化小工具
BinaryTreeGraph
,也用Java寫了個列印器BinaryTreePrinter
具體程式碼實現請看github
BinaryTreeGraph(JS版)
- 線上演示:BinaryTreeGraph
BinaryTreePrinter(Java版)
簡介
- 樹狀列印一棵二叉樹
- 比如輸入一棵二叉搜尋樹
- [381, 12, 410, 9, 40, 394, 540, 35, 190, 476, 760, 146, 445, 600, 800]
- 就會輸出
- 或者輸出
核心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<E> implements BinaryTreeInfo {
/**這裡省略了大量程式碼,只貼出了脈絡程式碼**/
private Node<E> root;
private static class Node<E> {
E element;
Node<E> left;
Node<E> right;
}
/********** BinaryTreeInfo **********/
@Override
public Object root() {
// 根節點是誰?
return root;
}
@Override
public Object left(Object node) {
// 如何查詢左節點?
return ((Node<E>)node).left;
}
@Override
public Object right(Object node) {
// 如何查詢右節點?
return ((Node<E>)node).right;
}
@Override
public Object string(Object node) {
// 如何列印單個節點?
return ((Node<E>)node).element;
}
/********** BinaryTreeInfo **********/
}
列印
// 隨機生成的一棵二叉搜尋樹(random generation)
BinarySearchTree<Integer> bst = ...;
// PrintStyle.LEVEL_ORDER(層序列印)
BinaryTrees.println(bst);
// PrintStyle.INORDER(中序列印)
BinaryTrees.println(bst, PrintStyle.INORDER);
生成字串寫入檔案
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;
}
});