二叉树遍历方式代码解读(2迭代)

1.先序遍历(用栈来实现):

java 复制代码
void preOrderIter(TreeNode root) {
    if (root == null) return;

    Stack<TreeNode> stack = new Stack<>();
    stack.push(root);  // 根节点先入栈

    while (!stack.isEmpty()) {
        // 出栈 = 访问
        TreeNode node = stack.pop();
        System.out.print(node.val + " ");

        // 先压右,再压左 → 出栈时就是左先访问
        if (node.right != null) {
            stack.push(node.right);
        }
        if (node.left != null) {
            stack.push(node.left);
        }
    }
}

解读

栈是后进先出

想要访问顺序:根 → 左 → 右

所以入栈必须反过来:先右、后左

出栈自然就是:根 → 左 → 右

2.中序遍历:

java 复制代码
void inOrderIter(TreeNode root) {
    Stack<TreeNode> stack = new Stack<>();
    TreeNode cur = root;  // 当前遍历指针

    while (cur != null || !stack.isEmpty()) {
        // 1. 一路向左走到最深处
        while (cur != null) {
            stack.push(cur);
            cur = cur.left;
        }

        // 2. 左边没了,弹出一个节点访问
        cur = stack.pop();
        System.out.print(cur.val + " ");

        // 3. 转向右子树
        cur = cur.right;
    }
}

解读

核心逻辑:一路左到底 → 访问 → 再右

这是面试必考手写的遍历方式

建议背熟

3.后序遍历:

java 复制代码
void postOrderIter(TreeNode root) {
    if (root == null) return;

    Stack<TreeNode> s1 = new Stack<>();
    Stack<TreeNode> s2 = new Stack<>();

    s1.push(root);

    while (!s1.isEmpty()) {
        TreeNode node = s1.pop();
        s2.push(node);  // 弹出就压入第二个栈

        // 先左后右 → 最终 s2 出栈就是 左→右→根
        if (node.left != null) {
            s1.push(node.left);
        }
        if (node.right != null) {
            s1.push(node.right);
        }
    }

    // s2 依次出栈就是后序
    while (!s2.isEmpty()) {
        System.out.print(s2.pop().val + " ");
    }
}

解读

s1 处理顺序:根 → 右 → 左

压入 s2 后反过来:左 → 右 → 根

最后 s2 依次出栈就是标准后序

相关推荐
long316几秒前
PostgreSQL 学习资料 · 入门 / 练习 / 精通 / 扩展
java·数据结构·数据库·spring boot·sql·postgresql·数据库开发
烬羽27 分钟前
一个队列,怎么让滑动窗口从 O(nk) 变 O(n)?单调队列彻底搞懂
javascript·数据结构·算法
XH华34 分钟前
C++语言第四章:模板初阶
数据结构·c++·算法
木木子2213 小时前
# 鸿蒙 ArkTS 实战:秒表 Stopwatch(示例 5)
数据结构·华为·list·harmonyos
geats人山人海14 小时前
数据结构第六章c语言 树的存储下二叉树的概念和存储
c语言·数据结构·算法
白狐_79815 小时前
408 数据结构算法题 01:线性表暴力求解保分指南
java·数据结构·算法
冻柠檬飞冰走茶16 小时前
PTA基础编程题目集 7-31 字符串循环左移(C语言实现)
c语言·开发语言·数据结构·算法
来一碗刘肉面17 小时前
树的存储结构
数据结构
GrowthDiary00717 小时前
算法题:寻找二维数组top k问题
数据结构·python·算法
SHARK_pssm18 小时前
【数据结构——栈】
数据结构