1public List<Integer> postorderTraversal(TreeNode root) {
2 List<Integer> result = new ArrayList<>();
3 Stack<TreeNode> stack = new Stack<>();
4 TreeNode lastVisited = null;
5 TreeNode current = root;
6
7 while (!stack.isEmpty() || current != null) {
8 if (current != null) {
9 stack.push(current);
10 current = current.left;
11 } else {
12 TreeNode peekNode = stack.peek();
13 if (peekNode.right != null && lastVisited != peekNode.right) {
14 current = peekNode.right;
15 } else {
16 result.add(peekNode.val);
17 lastVisited = stack.pop();
18 }
19 }
20 }
21
22 return result;
23}