Pre-introduction, middle-introduction, post-introduction
public List<Integer> postorderTraversal(TreeNode root) {
List<Integer> res = new ArrayList<>();
Deque<TreeNode> stack = new LinkedList<>();
if(root != null){
stack.push(root);
}
while(!stack.isEmpty()){
TreeNode cur = stack.pop();
if(cur != null){
//这里是后序遍历左,右,根,
//由于最后处理根,则需要最先入栈
stack.push(cur);
//cur后空结点随之入栈,标识已经访问过,但还没有被处理(还可以进行额外操作)
stack.push(null);
//根据前中后顺序的不同,改变cur,left,righ的入栈顺序即可
if(cur.right != null)
stack.push(cur.right);
if(cur.left != null)
stack.push(cur.left);
}else{
res.add(stack.pop().val);
}
}
return res;
}
Normal iteration
//前序
public List<Integer> preorderTraversal(TreeNode root) {
List<Integer> res = new LinkedList<>();
if (root == null) return res;
Deque<TreeNode> stack = new LinkedList<>();
TreeNode cur = root;
while (cur != null || !stack.isEmpty()) {
if (cur != null) {
res.add(cur.val);
stack.push(cur.right);
cur = cur.left;
} else cur = stack.pop();
}
return res;
}
//中序
public List<Integer> inorderTraversal(TreeNode root) {
Deque<TreeNode> stack = new LinkedList<>();
List<Integer> list = new LinkedList<>();
if (root == null) return list;
TreeNode cur = root;
while (cur != null || !stack.isEmpty()) {
if (cur != null) {
stack.push(cur);
cur = cur.left;
} else {
cur = stack.pop();
list.add(cur.val);
cur = cur.right;
}
}
return list;
}
//后序
public List<Integer> postorderTraversal(TreeNode root) {
List<Integer> res = new LinkedList<>();
Deque<TreeNode> stack = new LinkedList<>();
TreeNode cur = root, pre = null;
while (cur != null || !stack.isEmpty()) {
if (cur != null) {
stack.push(cur);
cur = cur.left;
} else {
cur = stack.peek();
// 右孩子为空或者访问过了
if (cur.right == null || cur.right == pre) {
res.add(cur.val);
stack.pop();
pre = cur;
cur = null;
} else cur = cur.right;
}
}
return res;
}