题目地址:
中序遍历二叉树。 用栈模拟递归。递归的过程是,从树根开始一路向左,同时记录住一路经过的节点,直到向左走到null后回退一步,打印节点,接着向其右子树拐过去,继续重复一路向左,直到右子树遍历完后,回退到树根的上一个节点,打印之,再拐入右子树继续重复。所以用栈来模拟的话就是,先从树根出发一路向左,同时将路径上所有节点按顺序入栈,直到走到null,走到null后,栈里弹出来一个节点就可以访问之了,因为其左子树是空。访问完后向右拐,如果右子树不空就继续上面一路向左的过程;否则就将栈里继续弹出一个节点并访问,然后继续向右拐重复上面的操作。代码如下:
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Deque;
import java.util.List;
public class Solution {
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> res = new ArrayList<>();
Deque<TreeNode> stack = new ArrayDeque<>();
TreeNode cur = root;
// cur != null对应的是右子树不空的情形,这时也要进行一路向左的操作;
// 如果cur == null说明子树已经访问完了,要返回到子树根的父亲节点继续访问,然后向右拐,一路向左
while (cur != null || !stack.isEmpty()) {
// 一路向左
while (cur != null) {
stack.push(cur);
cur = cur.left;
}
// 走到null的时候就将栈顶弹出并访问,然后向右子树拐过去
cur = stack.pop();
res.add(cur.val);
cur = cur.right;
}
return list;
}
}
相关链接: