網上絕大部分的二叉樹打印效果都十分潦草,也不夠直觀形象,最近本身用JS寫了個圖形化小工具
BinaryTreeGraph
,也用Java寫了個打印器BinaryTreePrinter
,還有個Objective-C版本BinaryTreePrinterOC
具體代碼實現請看githubjava
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 } }
/** * 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; } });
public class BinaryHeap<E> 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<Integer> heap = new BinaryHeap<>(); for (int i = 0; i < 10; i++) { heap.add((int)(Math.random() * 100)); } BinaryTrees.println(heap);
MJBinaryTreeInfo
協議@interface MJBSTNode : NSObject { @public id _element; MJBSTNode *_left; MJBSTNode *_right; } @end @interface MJBinarySearchTree : NSObject <MJBinaryTreeInfo> @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];