二叉の木がJavaを遍歴している。

6629 ワード

二叉の木の遍歴は三つの種類に分けられています。まず、中から順に遍歴し、後から順に遍歴します。つまり根の左右、左から右へ、左右の根です。この三つの遍歴の考え方は大体分かります。再帰的な方法を貼って二叉の木のコードを遍歴しています。
//      ,    ,              
package order;

/**
 * @date 2017 7 1   9:26:02
 */
public class BinaryTree {

    protected Node root;

    public BinaryTree(Node root) {
        this.root = root;
    }

    public Node getRoot() {
        return root;
    }

    /**     */
    public static Node init() {
        Node a = new Node('A');
        Node b = new Node('B', null, a);
        Node c = new Node('C');
        Node d = new Node('D', b, c);
        Node e = new Node('E');
        Node f = new Node('F', e, null);
        Node g = new Node('G', null, f);
        Node h = new Node('H', d, g);
        return h;// root
    }

    /**      */
    public static void visit(Node p) {
        System.out.print(p.getKey() + " ");
    }

    /**          */
    protected static void preorder(Node p) {
        if (p != null) {
            visit(p);
            preorder(p.getLeft());
            preorder(p.getRight());
        }
    }

    /**          */
    protected static void inorder(Node p) {
        if (p != null) {
            inorder(p.getLeft());
            visit(p);
            inorder(p.getRight());
        }
    }

    /**          */
    protected static void postorder(Node p) {
        if (p != null) {
            postorder(p.getLeft());
            postorder(p.getRight());
            visit(p);
        }
    }

    public static void main(String[] args) {
        BinaryTree tree = new BinaryTree(init());
        System.out.print(" Pre-Order:");
        preorder(tree.getRoot());

        System.out.print(" 
In-Order:"
); inorder(tree.getRoot()); System.out.print("
Post-Order:"
); postorder(tree.getRoot()); } } class Node { private char key; private Node left, right; public Node(char key) { this(key, null, null); } public Node(char key, Node left, Node right) { this.key = key; this.left = left; this.right = right; } public char getKey() { return key; } public void setKey(char key) { this.key = key; } public Node getLeft() { return left; } public void setLeft(Node left) { this.left = left; } public Node getRight() { return right; } public void setRight(Node right) { this.right = right; } }
二叉樹のエルゴードについても、前のシーケンスから得られたのはルート(第一のノード)であるという点を指摘した。中間シーケンスで得られたのは、左右のサブツリーの分割です。後のシーケンスから得られたのはルート(最後のノード)です。前のシーケンスと後のシーケンスはルートのみを得ることができ、左右のサブツリーの分割が得られないので、唯一の二叉ツリーを決定することはできません。(前の順序+中の順序)または(後の順序+中の順序)は、一本の二叉樹を一意に確定することができます。
再帰的ではない形で二叉樹の遍歴を実現したいなら、参照してください。