class Solution {
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> res = new ArrayList<>();
Deque<Frame> stack = new ArrayDeque<>();
// 首次进入函数
stack.add(new Frame(root, 0));
// 开始递归
while(!stack.isEmpty()){
Frame cur = stack.peek();
TreeNode treeNode = cur.treeNode;
// 递归终止条件
if(treeNode == null){
stack.pop();
continue;
}
// 递归函数体
switch (cur.step){
case 0:{// 步骤一
stack.push(new Frame(treeNode.left, 0));
break;
}
case 1:{// 步骤二
consume(res, treeNode);// 中序遍历;前序遍历可将此步骤与步骤一交换;后序遍历同理
break;
}
case 2:{// 步骤三
stack.push(new Frame(treeNode.right, 0));
break;
}
case 3:{// 退出当前函数体
stack.pop();
break;
}
}
cur.step++;// 当前步骤执行结束,到下一个步骤
}
return res;
}
/**
* 处理节点
*/
private void consume(List<Integer> res, TreeNode treeNode) {
res.add(treeNode.val);
}
/**
* 模拟函数栈帧;treeNode 为数据,step 为函数执行位置
private static class Frame {
TreeNode treeNode;
int step;
public Frame(TreeNode treeNode, int step) {
this.treeNode = treeNode;
this.step = step;
}
}
}