二叉樹的先序、中序、後序遍歷

複習一波,go!
三種遍歷方式本質區別在於遍歷順序不同。
以L、D、R分別表示遍歷左子樹、訪問根節點、訪問右子樹,先序遍歷爲DLR;中序遍歷爲LDR;後序遍歷爲LRD。(別隻給三個字母就不認識誰是誰了,L就是left,……很好記憶)
有了遍歷順序,基於二叉樹的遞歸定義,可得下述遍歷二叉樹的遞歸算法:

  1. 先序遍歷二叉樹的操作定義爲:
    (1)訪問根節點;
    (2)先序遍歷左子樹;
    (3)先序遍歷右子樹;
  2. 中序:
    (1)中序遍歷左子樹;
    (2)訪問根節點;
    (3)中序遍歷右子樹;
  3. 後序:
    (1)後序遍歷左子樹;
    (2)後序遍歷右子樹;
    (3)訪問根節點;

測試用的二叉樹:

二叉樹

遞歸代碼:

public class ThreeOrders {
    public static void main(String[] args) {
        // 構造二叉樹的代碼,忽略,看圖就好
        TreeNode n = new TreeNode("A"), l = new TreeNode("B"), r = new TreeNode(
                "C");
        n.left = l;
        n.right = r;
        l.left = new TreeNode("D");
        l.right = new TreeNode("E");
        r.left = new TreeNode("F");
        // 遍歷
        System.out.print("先序遍歷:");
        preOrder(n);
        System.out.print("\n中序遍歷:");
        midOrder(n);
        System.out.print("\n後序遍歷:");
        lastOrder(n);
    }

    private static void preOrder(TreeNode tree) {
        // 順序DLR
        /*
         * visit(tree); if (tree.left != null) preOrder(tree.left); if
         * (tree.right != null) preOrder(tree.right);
         */
        // 寫法2
        if (tree != null) {
            visit(tree);
            preOrder(tree.left);
            preOrder(tree.right);
        }
    }

    private static void midOrder(TreeNode tree) {
        if (tree != null) {
            midOrder(tree.left);
            visit(tree);
            midOrder(tree.right);
        }
    }

    private static void lastOrder(TreeNode tree) {
        if (tree != null) {
            lastOrder(tree.left);
            lastOrder(tree.right);
            visit(tree);
        }
    }

    private static void visit(TreeNode n) {
        System.out.print(n.data);
    }
}

class TreeNode {
    String data;
    TreeNode left, right;

    public TreeNode(String s) {
        data = s;
    }
}

結果:

先序遍歷:ABDECF
中序遍歷:DBEAFC
後序遍歷:DEBFCA
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章