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 依次出栈就是标准后序