vector<int> postorderTraversal(TreeNode* root) {
  vector<int> result;
  stack<TreeNode*> stk;
  TreeNode* prev = nullptr;
  while (root || !stk.empty()) {
    while (root) {
      stk.push(root);
      root = root->left;
    }
    root = stk.top();
    stk.pop();
    if (!root->right || root->right == prev) {
	    result.push_back(root->val);
	    prev = root;
	    root = nullptr;
    } else {
	    stk.push(root);
	    root = root->right;
    }
  }
  return result;
}