public ArrayList<Integer> postorderTraversal(TreeNode root) {
    ArrayList<Integer> result = new ArrayList<Integer>();
    Stack<Record> stk = new Stack<Record>();
    if (root == null) return result;

    TreeNode n_cur = root;
    while (n_cur != null) {
      stk.push(new Record(n_cur));
      n_cur = n_cur.left;
    }

    while (!stk.isEmpty()) {
      Record rec = stk.pop();
      if (rec.tag == 0) {
        rec.tag = 1;
        stk.push(rec);
        n_cur = rec.node.right;
        while (n_cur != null) {
          stk.push(new Record(n_cur));
          n_cur = n_cur.left;
        }
      } else result.add(rec.node.val);
    }
    return result;
  }