二叉树的前序中序后序遍历 NC 45 LC 144 LC 94 LC 145

概述

前序遍历:根节点、左子树、右子树

中序遍历:左子树、根节点、右子树

后序遍历:左子树、右子树、根节点

主要有三种遍历方法:递归、迭代、Morris遍历

递归方法:

时间复杂度:

空间复杂度:平均情况为 最坏情况为 (即树呈链状)

迭代方法:

即显式地维护递归方法中的栈

时间复杂度、空间复杂度和递归方法一致。

Morris遍历:

时间复杂度:

空间复杂度:

(代码可参考leetcode题解,等掌握了再更新...)

1. 递归遍历

import java.util.*;

/*
 * public class TreeNode {
 *   int val = 0;
 *   TreeNode left = null;
 *   TreeNode right = null;
 * }
 */

public class Solution {
    /**
     * 
     * @param root TreeNode类 the root of binary tree
     * @return int整型二维数组
     */

    List<Integer> preOrder;
    List<Integer> inOrder;
    List<Integer> postOrder;

    public int[][] threeOrders (TreeNode root) {
        // write code here
        preOrder = new ArrayList<>();
        inOrder = new ArrayList<>();
        postOrder = new ArrayList<>();
        setPreOder(root);
        setInOrder(root);
        setPostOrder(root);
        int[][] ans = new int[3][preOrder.size()];
        for (int i = 0; i < preOrder.size(); i++) {
            ans[0][i] = preOrder.get(i).intValue();
            ans[1][i] = inOrder.get(i).intValue();
            ans[2][i] = postOrder.get(i).intValue();
        }
        return ans;
    }

    private void setPreOder(TreeNode root) {
        if (root != null) {
            preOrder.add(root.val);
            setPreOder(root.left);
            setPreOder(root.right);
        }
    }

    private void setInOrder(TreeNode root) {
        if (root != null) {
            setInOrder(root.left);
            inOrder.add(root.val);
            setInOrder(root.right);
        }
    }

    private void setPostOrder(TreeNode root) {
        if (root != null) {
            setPostOrder(root.left);
            setPostOrder(root.right);
            postOrder.add(root.val);
        }
    }
}

2. 迭代遍历

import java.util.*;

/*
 * public class TreeNode {
 *   int val = 0;
 *   TreeNode left = null;
 *   TreeNode right = null;
 * }
 */

public class Solution {
    /**
     * 
     * @param root TreeNode类 the root of binary tree
     * @return int整型二维数组
     */

    List<Integer> preOrder = new ArrayList<>();
    List<Integer> inOrder = new ArrayList<>();
    List<Integer> postOrder = new ArrayList<>();

    public int[][] threeOrders (TreeNode root) {
        // write code here
        setPreOrder(root);
        setInOrder(root);
        setPostOrder(root);
        int len = preOrder.size();
        int[][] ans = new int[3][len];
        for (int i = 0; i < len; i++) {
            ans[0][i] = preOrder.get(i).intValue();
            ans[1][i] = inOrder.get(i).intValue();
            ans[2][i] = postOrder.get(i).intValue();
        }
        return ans;
    }

    private void setPreOrder(TreeNode root) {
        if (root != null) {
            Stack<TreeNode> stack = new Stack<>();
            TreeNode node = root;
            while (!stack.isEmpty() || node != null) {
                while (node != null) {
                    preOrder.add(node.val);
                    stack.push(node);
                    node = node.left;
                }
                node = stack.pop();
                node = node.right;
            }
        }
    }

    private void setInOrder(TreeNode root) {
        if (root != null) {
            Stack<TreeNode> stack = new Stack<>();
            TreeNode node = root;
            while (!stack.isEmpty() || node != null) {
                while (node != null) {
                    stack.push(node);
                    node = node.left;
                }
                node = stack.pop();
                inOrder.add(node.val);
                node = node.right;
            }
        }
    }

    private void setPostOrder(TreeNode root) {
        if (root != null) {
            Stack<TreeNode> stack = new Stack<>();
            TreeNode prev = null;
            while (root != null || !stack.isEmpty()) {
                while (root != null) {
                    stack.push(root);
                    root = root.left;
                }
                root = stack.pop();
                if (root.right == null || root.right == prev) {
                    postOrder.add(root.val);
                    prev = root;
                    root = null;
                } else {
                    stack.push(root);
                    root = root.right;
                }
            }
        }
    }
}