vector<vector<int> > threeOrders(TreeNode* root) {
return {preOrder(root),inOrder(root),postOrder(root)};
}
vector<int> preOrder(TreeNode* root)
{
stack<TreeNode* > s;
vector<int> v;
s.push(root);
while(!s.empty())
{
TreeNode* p=s.top();
s.pop();
v.push_back(p->val);
if(p->right)
s.push(p->right);
if(p->left)
s.push(p->left);
}
return v;
}
vector<int> inOrder(TreeNode* root)
{
stack<TreeNode* > s;
vector<int> v;
s.push(root);
TreeNode* pre=root;
while(!s.empty())
{
TreeNode* p=s.top();
if(p->left&&p->left!=pre&&p->right!=pre)//左孩子不为空,且左右孩子没有被遍历
s.push(p->left);
else if(p->right==pre)//刚遍历了右孩子
{
s.pop();
pre=p;
}
else if(!p->left||p->left==pre)//左孩子为空或者左孩子被遍历,且右孩子未遍历
{
v.push_back(p->val);
pre=p;
if(p->right)
s.push(p->right);
else
s.pop();
}
}
return v;
}
vector<int> postOrder(TreeNode* root)
{
stack<TreeNode* > s;
vector<int> v;
s.push(root);
TreeNode* pre=root;
while(!s.empty())
{
TreeNode* p=s.top();
if(p->left&&p->left!=pre&&p->right!=pre)//左孩子不为空,且左右孩子没有被遍历
s.push(p->left);
else if(p->right==pre)//刚遍历了右孩子
{
v.push_back(p->val);
pre=p;
s.pop();
}
else if(!p->left||p->left==pre)//左孩子为空或者左孩子被遍历,且右孩子未遍历
{
if(p->right)
s.push(p->right);
else//左孩子为空或已遍历,且右孩子为空
{
v.push_back(p->val);
pre=p;
s.pop();
}
}
}
return v;
}