圖解二叉樹的三種遍歷方式及java實現

二叉樹(binary tree)是一顆樹,其中每一個節點都不能有多於兩個的兒子。node

1.二叉樹節點

做爲圖的特殊形式,二叉樹的基本組成單元是節點與邊;做爲數據結構,其基本的組成實體是二叉樹節點(binary tree node),而邊則對應於節點之間的相互引用。數據結構

以下,給出了二叉樹節點的數據結構圖示和相關代碼:post

// 定義節點類:
    private static class BinNode {
        private Object element;
        private BinNode lChild;// 定義指向左子樹的指針
        private BinNode rChild;// 定義指向右子樹的指針

        public BinNode(Object element, BinNode lChild, BinNode rChild) {
            this.element = element;
            this.lChild = lChild;
            this.rChild = rChild;
        }
    }

2.遞歸遍歷

二叉樹自己並不具備自然的全局次序,故爲實現遍歷,需經過在各節點與其孩子之間約定某種局部次序,間接地定義某種全局次序。
按慣例左兄弟優先於右兄弟,故若將節點及其孩子分別記做V、L和R,則下圖所示,局部訪問的次序可有VLR、LVR和LRV三種選擇。根據節點V在其中的訪問次序,三種策略也相應地分別稱做先序遍歷、中序遍歷和後序遍歷,下面將分別介紹。測試

2.1 先序遍歷this

圖示:spa

 

 

代碼實現:指針

/**
     * 對該二叉樹進行前序遍歷 結果存儲到list中 前序遍歷
     */
    public static void preOrder(BinNode node) {
        list.add(node); // 先將根節點存入list
        // 若是左子樹不爲空繼續往左找,在遞歸調用方法的時候一直會將子樹的根存入list,這就作到了先遍歷根節點
        if (node.lChild != null) {
            preOrder(node.lChild);
        }
        // 不管走到哪一層,只要當前節點左子樹爲空,那麼就能夠在右子樹上遍歷,保證了根左右的遍歷順序
        if (node.rChild != null) {
            preOrder(node.rChild);
        }
    }

2.2 中序遍歷code

圖示:遞歸

代碼實現:element

/**
     * 對該二叉樹進行中序遍歷 結果存儲到list中
     */
    public static void inOrder(BinNode node) {
        if (node.lChild != null) {
            inOrder(node.lChild);
        }
        list.add(node);
        if (node.rChild != null) {
            inOrder(node.rChild);
        }
    }

2.3 後序遍歷

實例圖示:

代碼實現:

/**
     * 對該二叉樹進行後序遍歷 結果存儲到list中
     */
    public static void postOrder(BinNode node) {
        if (node.lChild != null) {
            postOrder(node.lChild);
        }
        if (node.rChild != null) {
            postOrder(node.rChild);
        }
        list.add(node);
    }

附:測試相關代碼

private static BinNode root;
    private static List<BinNode> list = new ArrayList<BinNode>();

    public static void main(String[] args) {
        init();
        // TODO Auto-generated method stub
        //preOrder(root);
        //inOrder(root);
        postOrder(root);
        for (int i = 0; i < list.size(); i++) {
            System.out.print(list.get(i).element + " ");
        }
    }

    // 樹的初始化:先從葉節點開始,由葉到根
    public static void init() {
        BinNode b = new BinNode("b", null, null);
        BinNode a = new BinNode("a", null, b);
        BinNode c = new BinNode("c", a, null);
        
        BinNode e = new BinNode("e", null, null);
        BinNode g = new BinNode("g", null, null);
        BinNode f = new BinNode("f", e, g);
        BinNode h = new BinNode("h", f, null);
        
        BinNode d = new BinNode("d", c, h);
        
        BinNode j = new BinNode("j", null, null);
        BinNode k = new BinNode("k", j, null);
        BinNode m = new BinNode("m", null, null);
        BinNode o = new BinNode("o", null, null);
        BinNode p = new BinNode("p", o, null);
        BinNode n = new BinNode("n", m, p);
        BinNode l = new BinNode("l", k, n);
        
        root = new BinNode("i", d, l);
    }
相關文章
相關標籤/搜索