LeetCode 94. 二叉树的中序遍历、145. 二叉树的后序遍历、144. 二叉树的前序遍历、迭代法

70 阅读1分钟

上次使用递归实现了二叉树的遍历 今天使用迭代法实现二叉树的遍历

二叉树递归实现遍历

144. 二叉树的前序遍历

题目描述

给你二叉树的根节点 root ,返回它节点值的 前序 遍历。

示例

输入:root = [1,null,2,3]
输出:[1,2,3]

定义

public class TreeNode {
    int val;
    TreeNode left;
    TreeNode right;

    TreeNode() {}

    TreeNode(int val) {this.val = val;}

    TreeNode(int val, TreeNode left, TreeNode right) {
        this.val = val;
        this.left = left;
        this.right = right;
    }
}

算法实现

  public List<Integer> preorder(TreeNode root) {
        List<Integer> result = new ArrayList<>();

        if (root == null) {
            return result;
        }

        final Stack<TreeNode> stack = new Stack<>();
        stack.push(root);

        while (!stack.isEmpty()) {
            final TreeNode node = stack.pop();
            result.add(node.val);
            if (node.right != null) {
                stack.push(node.right);
            }
            if (node.left != null) {
                stack.push(node.left);
            }
        }
        return result;
    }

145. 二叉树的后序遍历

题目描述

给你一棵二叉树的根节点 root ,返回其节点值的 后序遍历

示例

输入:root = [1,null,2,3]
输出:[3,2,1]

算法实现

   public List<Integer> postOrder(TreeNode root) {
        List<Integer> result = new ArrayList<>();

        if (root == null) {
            return result;
        }

        final Stack<TreeNode> stack = new Stack<>();

        stack.push(root);

        while (!stack.isEmpty()) {
            final TreeNode node = stack.pop();
            result.add(node.val);
            if (node.left != null) {
                stack.push(node.left);
            }
            if (node.right != null) {
                stack.push(node.right);
            }
        }
        Collections.reverse(result);
        return result;
    }

后序遍历 左右中 代码实现思路是中右左 再进行反转就可以实现相应的迭代遍历

94. 二叉树的中序遍历

题目描述

给定一个二叉树的根节点 root ,返回 它的 中序 遍历

示例

输入:root = [1,null,2,3]
输出:[1,3,2]

算法实现

 public List<Integer> inorder(TreeNode root) {
        List<Integer> result = new ArrayList<>();
        if (root == null) {
            return result;
        }
        TreeNode curr = root;
        final Stack<TreeNode> stack = new Stack<>();
        while (curr != null || !stack.isEmpty()) {
            if (curr != null) {
                stack.push(curr);
                curr = curr.left;
            } else {
                final TreeNode node = stack.pop();
                result.add(node.val);
                curr = node.right;
            }
        }
        return result;
    }