如何直觀形象地樹狀列印一棵二叉樹?

M了個J發表於2019-03-30

網上絕大部分的二叉樹列印效果都十分潦草,也不夠直觀形象,最近自己用JS寫了個圖形化小工具BinaryTreeGraph,也用Java寫了個列印器BinaryTreePrinter
具體程式碼實現請看github

BinaryTreeGraph(JS版)

如何直觀形象地樹狀列印一棵二叉樹?

如何直觀形象地樹狀列印一棵二叉樹?

如何直觀形象地樹狀列印一棵二叉樹?

如何直觀形象地樹狀列印一棵二叉樹?

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;
    }
});

如何直觀形象地樹狀列印一棵二叉樹?

如何直觀形象地樹狀列印一棵二叉樹?

相關文章