vector<int> preorderTraversal(TreeNode* root) {
vector<int> res;
stack<TreeNode*> st;
TreeNode *p = root;
while(p|| !st.empty())
{
while(p)
{
res.push_back(p->val);
st.push(p->right);
p = p->left;
}
p = st.top();st.pop();
}
return res;
}
vector<int> postorderTraversal(TreeNode* root) {
vector<int> res;
stack<TreeNode*> st;
TreeNode * p = root;
while(p or !st.empty())
{
while(p)
{
res.push_back(p->val);
st.push(p->left);
p = p->right;
}
p = st.top();st.pop();
}
reverse(res.begin(),res.end);
return res;
}
vector<int> inorderTraversal(TreeNode* root)
{
vector<int> res;
stack<TreeNode*> st;
TreeNode * p = root;
while(p or !st.empty())
{
while(p)
{
st.push(p);
p = p->left;
}
p = st.top();st.pop();
res.push_back(p->val);
p = p->right;
}
return res;
}