二叉树的先序、中序、后序遍历的递归与非递归实现

94 阅读1分钟

二叉树的结构定义

public class Node {
    int data;
    Node left;
    Node right;
}

1. 先序遍历

访问根节点,对左子节点做先序遍历,再对右子节点做先序遍历

递归实现

public void preOrder(Node root) {
    if (root == null) {
        return;
    }
    System.out.println(root.data);
    preOrder(root.left);
    preOrder(root.right);
}

非递归实现

public void preOrder(Node root) {
    if (root == null) {
        return;
    }
    Deque<Node> stack = new LinkedList<>();
    stack.push(root);
    while (!stack.isEmpty()) {
        Node curr = stack.pop();
        System.out.println(curr.data);
        if (curr.right != null) {
            stack.push(curr.right);
        }
        if (curr.left != null) {
            stack.push(curr.left);
        }
    }
}

2. 中序遍历

对左子节点做中序遍历,访问当前节点,对右子节点做先序遍历

递归实现

public void inOrder(Node root) {
    if (root == null) {
        return;
    }
    inOrder(root.left);
    System.out.println(root.data);
    inOrder(root.right);
}

非递归实现

public void inOrder(Node root) {
    if (root == null) {
        return;
    }
    Deque<Node> stack = new LinkedList<>();
    Node curr = root;
    while (curr != null || !stack.isEmpty()) {
        while (curr != null) {
            stack.push(curr);
            curr = curr.left;
        }
        curr = stack.pop();
        System.out.println(curr.data);
        curr = curr.right;
    }
}

3. 后序遍历

对左子节点做后序遍历,对右子节点做先序遍历,访问当前节点

递归实现

public void postOrder(Node root) {
    if (root == null) {
        return;
    }
    postOrder(root.left);
    postOrder(root.right);
    System.out.println(root.data);
}

非递归实现

public void postOrder(Node root) {
    if (root == null) {
        return;
    }
    Deque<Node> stack = new LinkedList<>();
    Node curr = root, pre = null;
    while (curr != null || !stack.isEmpty()) {
        while (curr != null) {
            stack.push(curr);
            curr = curr.left;
        }
        curr = stack.peek();
        if (curr.right != null && curr.right != pre) {
            curr = curr.right;
        } else {
            stack.pop();
            System.out.println(curr.data);
            pre = curr;
            curr = null;
        }
    }
}