二叉树3种遍历方式的6种实现

65 阅读1分钟

Binary Tree Traversal

Depth-first search

Pre-order

recursive

public class RecursiveSolution {

    void preorder(Node node) {
        if (node == null)
            return;
        System.out.println(node.value);
        preorder(node.left);
        preorder(node.right);
    }
}

iterative

right child is pushed first so that left is processed first

public class IterativeSolution {

    void preorder(Node node) {
        if (node == null)
            return;
        Deque<Node> stack = new ArrayDeque<>();
        stack.push(node);
        while (!stack.isEmpty()) {
            Node current = stack.pop();
            System.out.println(current.value);
            if (current.right != null)
                stack.push(current.right);
            if (current.left != null)
                stack.push(current.left);
        }
    }
}

In-order

recursive

public class RecursiveSolution {

    void inorder(Node node) {
        if (node == null)
            return;
        inorder(node.left);
        System.out.println(node.value);
        inorder(node.right);
    }
}

iterative

public class IterativeSolution {

    void inorder(Node node) {
        Deque<Node> stack = new ArrayDeque<>();
        while (node != null || !stack.isEmpty()) {
            if (node != null) {
                stack.push(node);
                node = node.left;
            } else {
                node = stack.pop();
                System.out.println(node.value);
                node = node.right;
            }
        }
    }
}

Post-order

recursive

public class RecursiveSolution {

    void postorder(Node node) {
        if (node == null)
            return;
        postorder(node.left);
        postorder(node.right);
        System.out.println(node.value);
    }
}

iterative

public class IterativeSolution {

    void postorder(Node node) {
        Deque<Node> stack = new ArrayDeque<>();
        Node last = null; // last node visited
        while (node != null || !stack.isEmpty()) {
            if (node != null) {
                stack.push(node);
                node = node.left;
            } else {
                Node top = stack.peek();
                if (top.right != null && top.right != last) {
                    node = top.right;
                } else {
                    System.out.println(top.value);
                    last = stack.pop();
                }
            }
        }
    }
}