二叉树的遍历

91 阅读2分钟

三道leetcode上的题目:

144.二叉树的前序遍历

94.二叉树的中序遍历

145.二叉树的后序遍历

前序遍历

前序遍历:中左右

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Stack;

/**
 * @Author blackcat
 * @version: 1.0
 * @description:二叉树的前序遍历 中左右
 * <p>
 *      5
 *   4    6
 * 1  2  7  8
 * <p>
 * 结果:5 4 1 2 6 7 8
 */
public class Leetcode144 {

    public static void main(String[] args) {
        TreeNode left = new TreeNode(4, new TreeNode(1, null, null), new TreeNode(2, null, null));
        TreeNode right = new TreeNode(6, new TreeNode(7, null, null), new TreeNode(8, null, null));
        TreeNode root = new TreeNode(5, left, right);
        List<Integer> list = preorderTraversal(root);
        System.out.println(Arrays.toString(list.toArray()));
        List<Integer> list2 = preorderTraversal2(root);
        System.out.println(Arrays.toString(list2.toArray()));
    }


    //迭代实现
    public static List<Integer> preorderTraversal2(TreeNode root) {
        List<Integer> list = new ArrayList<>();
        if (root == null) {
            return list;
        }
        Stack<TreeNode> stack = new Stack();
        stack.push(root);
        while (!stack.isEmpty()) {
            TreeNode node = stack.pop();
            list.add(node.val);
            if (node.right != null) {
                stack.push(node.right);
            }
            if (node.left != null) {
                stack.push(node.left);
            }
        }
        return list;
    }

    //遍历实现
    public static List<Integer> preorderTraversal(TreeNode root) {
        List<Integer> list = new ArrayList<>();
        preorder(root, list);
        return list;
    }

    private static void preorder(TreeNode node, List<Integer> list) {
        if (node == null) {
            return;
        }
        list.add(node.val);
        preorder(node.left, list);
        preorder(node.right, list);
    }
}

中序遍历

中序遍历:左中右

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Stack;

/**
 * @Author blackcat
 * @version: 1.0
 * @description:二叉树的中序遍历 <p>
 *     5
 *   4    6
 * 1  2  7  8
 * <p>
 * 结果:1 4 2 5 7 6 8
 */
public class Leetcode94 {

    public static void main(String[] args) {
        TreeNode left = new TreeNode(4, new TreeNode(1, null, null), new TreeNode(2, null, null));
        TreeNode right = new TreeNode(6, new TreeNode(7, null, null), new TreeNode(8, null, null));
        TreeNode root = new TreeNode(5, left, right);
        List<Integer> list = inorderTraversal(root);
        System.out.println(Arrays.toString(list.toArray()));
        List<Integer> list2 = inorderTraversal2(root);
        System.out.println(Arrays.toString(list2.toArray()));
    }
    //迭代实现
    public static List<Integer> inorderTraversal2(TreeNode root) {
        List<Integer> list = new ArrayList<>();
        if (root == null) {
            return list;
        }
        Stack<TreeNode> stack = new Stack<>();
        TreeNode cur = root;
        while (!stack.isEmpty() || cur != null) {
            if (cur != null) {
                stack.push(cur);
                cur = cur.left;
            } else {
                cur = stack.pop();
                list.add(cur.val);
                cur = cur.right;
            }
        }
        return list;
    }


    public static List<Integer> inorderTraversal(TreeNode root) {
        List<Integer> list = new ArrayList<>();
        inorder(root, list);
        return list;
    }

    //中序遍历递归实现 左中右
    private static void inorder(TreeNode node, List<Integer> list) {
        if (node == null) {
            return;
        }
        if (node.left != null) {
            inorder(node.left, list);
        }
        list.add(node.val);
        if (node.right != null) {
            inorder(node.right, list);
        }
    }
}

后序遍历

中序遍历:左右中

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Stack;

/**
 * @Author blackcat
 * @version: 1.0
 * @description:二叉树的后序遍历 <p>
 *    5
 *  4    6
 * 1  2  7  8
 * <p>
 * 结果:1 2 4  7 8 6 5
 */
public class Leetcode145 {


    public static void main(String[] args) {
        TreeNode left = new TreeNode(4, new TreeNode(1, null, null), new TreeNode(2, null, null));
        TreeNode right = new TreeNode(6, new TreeNode(7, null, null), new TreeNode(8, null, null));
        TreeNode root = new TreeNode(5, left, right);
        List<Integer> list = postorderTraversal(root);
        System.out.println(Arrays.toString(list.toArray()));
        List<Integer> list2 = postorderTraversal2(root);
        System.out.println(Arrays.toString(list2.toArray()));
    }

  //迭代实现
    public static List<Integer> postorderTraversal2(TreeNode root) {
        List<Integer> list = new ArrayList<>();
        if (root == null) {
            return list;
        }
        Stack<TreeNode> stack = new Stack<>();
        stack.push(root);
        while (!stack.isEmpty()) {
            TreeNode node = stack.peek();
            if (node != null) {
                stack.pop();// 将该节点弹出,避免重复操作,下面再将中右左节点添加到栈中
                stack.push(node);
                stack.push(null); // 中节点访问过,但是还没有处理,加入空节点做为标记。
                if (node.right != null) {
                    stack.push(node.right);
                }
                if (node.left != null) {
                    stack.push(node.left);
                }

            } else {// 只有遇到空节点的时候,才将下一个节点放进结果集
                //弹出空栈帧
                stack.pop();
                list.add(stack.pop().val);
            }
        }
        return list;
    }
    //遍历实现
    public static List<Integer> postorderTraversal(TreeNode root) {
        List<Integer> list = new ArrayList<>();
        postorder(root, list);
        return list;
    }

    private static void postorder(TreeNode node, List<Integer> list) {
        if (node == null) {
            return;
        }
        postorder(node.left, list);
        postorder(node.right, list);
        list.add(node.val);
    }
}