public List<Integer> postorderTraversal(TreeNode root) {
List<Integer> res = new ArrayList<>();
TreeNode dummy = new TreeNode(0);
TreeNode curNode = dummy, preNode = null;
while (curNode != null) {
if (curNode.left == null) {
while (preNode.right != null && preNode.right != curNode) {
// Traversing down to the left
if (preNode.right == null) {
// Traversing up from the right
reverse(curNode.left, preNode);
while (node != curNode.left) {
reverse(preNode, curNode.left);
public void reverse(TreeNode from, TreeNode to) {
TreeNode preNode = from, curNode = from.right, nextNode = null;
nextNode = curNode.right;