Java实现二叉树的三种遍历方式

2018-03-01  本文已影响4人  龙儿筝
/**
 * Desc:二叉树的遍历
 * 前序遍历:根节点,左子节点,右子节点.
 * 中序遍历:左子节点,根节点,右子节点
 * 后序遍历:左子节点,右子节点,根节点
 */
public class BinaryTree {
    public static void main(String[] args) {
        Node node = initNode();
        ergodicNode(node, Order.ORDER_AFTER);
        orderNode(node, Order.ORDER_AFTER);
    }

    /**
     * 递归遍历.
     * @param node 二叉树
     * @param order 遍历方式
     */
    private static void ergodicNode(Node node, Order order) {
        if (node != null) {
            if (order == Order.ORDER_FRONT) {
                System.out.print(node.getValue() + " ");
            }
            ergodicNode(node.getLeft(), order);
            if (order == Order.ORDER_CENTER) {
                System.out.print(node.getValue() + " ");
            }
            ergodicNode(node.getRight(), order);
            if (order == Order.ORDER_AFTER) {
                System.out.print(node.getValue() + " ");
            }
        }
    }

    /**
     * 非递归遍历.
     * @param root 二叉树
     * @param order 遍历方式
     */
    private static void orderNode(Node root, Order order) {
        Stack<Node> stack = new Stack<>();
        switch (order) {
            case ORDER_FRONT:
                if (root != null) {
                    stack.push(root);
                }
                while (!stack.empty()) {
                    Node node = stack.pop();
                    System.out.print(node.getValue() + " ");
                    if (node.getRight() != null) {
                        stack.push(node.getRight());
                    }
                    if (node.getLeft() != null) {
                        stack.push(node.getLeft());
                    }
                }
                break;
            case ORDER_CENTER:
                while (root != null || !stack.empty()) {
                    while (root != null) {
                        stack.push(root);
                        root = root.getLeft();
                    }
                    if (!stack.empty()) {
                        Node node = stack.pop();
                        System.out.print(node.getValue() + " ");
                        root = node.getRight();
                    }
                }
                break;
            case ORDER_AFTER:
                Stack<Node> output = new Stack<>();
                while (root != null || !stack.empty()) {
                    if (root != null) {
                        output.push(root);
                        stack.push(root);
                        root = root.getRight();
                    } else {
                        root = stack.pop();
                        root = root.getLeft();
                    }
                }
                while (!output.isEmpty()) {
                    System.out.print(output.pop().getValue() + " ");
                }
                break;
        }
    }

    /**
     *           63
     *          /  \
     *         /    \
     *        /      \
     *       /        \
     *      27        80
     *     /  \       / \
     *    /    \     /   \
     *   /      \   70    92
     *  13       51       /
     *   \      /  \     /
     *    \    /    \   82
     *    26  33    58
     *             /  \
     *            /    \
     *           57    60
     * 前序遍历:63 27 13 26 51 33 58 57 60 80 70 92 82
     * 中序遍历:13 26 27 33 51 57 58 60 63 70 80 82 92
     * 后序遍历:26 13 33 57 60 58 51 27 70 82 92 80 63
     *
     * @return Node
     */
    private static Node initNode() {
        return new Node(63)
                .setLeft(new Node(27)
                        .setLeft(new Node(13)
                                .setRight(new Node(26)))
                        .setRight(new Node(51)
                                .setLeft(new Node(33))
                                .setRight(new Node(58)
                                        .setLeft(new Node(57))
                                        .setRight(new Node(60)))))
                .setRight(new Node(80)
                        .setLeft(new Node(70))
                        .setRight(new Node(92)
                                .setLeft(new Node(82))));
    }

    enum Order {
        ORDER_FRONT, ORDER_CENTER, ORDER_AFTER
    }

    private static class Node {
        private int value;
        private Node left;
        private Node right;

        private Node(int value) {
            this.value = value;
        }

        private int getValue() {
            return value;
        }

        private Node getLeft() {
            return left;
        }

        private Node setLeft(Node left) {
            this.left = left;
            return this;
        }

        private Node getRight() {
            return right;
        }

        private Node setRight(Node right) {
            this.right = right;
            return this;
        }
    }
}

上一篇下一篇

猜你喜欢

热点阅读