/**
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
//递归版本大家基本都会
//但是我觉得迭代版本的写法就很灵活,特别是中序和后序遍历
//巧妙借用stack容器的特性,大家可以多关注下迭代版本
class Solution {
private:
vector<int> preOrder,inOrder,postOrder;
public:
vector<vector<int> > threeOrders(TreeNode* root) {
vector<vector<int>> ans;
if(!root) return ans;
PreOrderIteratively(root);
InOrderIteratively(root);
PostOrderIteratively(root);
ans.push_back(preOrder);
ans.push_back(inOrder);
ans.push_back(postOrder);
return ans;
}
void PreOrder(TreeNode* root){
if(!root) return ;
preOrder.push_back(root->val);
PreOrder(root->left);
PreOrder(root->right);
}
void InOrder(TreeNode* root){
if(!root) return;
InOrder(root->left);
inOrder.push_back(root->val);
InOrder(root->right);
}
void PostOrder(TreeNode* root){
if(!root) return ;
PostOrder(root->left);
PostOrder(root->right);
postOrder.push_back(root->val);
}
void PreOrderIteratively(TreeNode* root){
if(root==nullptr)
return;
stack<TreeNode*> stk;
stk.push(root);
TreeNode* p=nullptr;
while(!stk.empty()){
p=stk.top();
stk.pop();
preOrder.push_back(p->val);
if(p->right)
stk.push(p->right);
if(p->left)
stk.push(p->left);
}
}
void InOrderIteratively(TreeNode* root){
if(!root)
return;
stack<TreeNode*> stk;
TreeNode* p=root;
while(p || !stk.empty()){
if(p){
stk.push(p);
p=p->left;
}
else{
p=stk.top();
stk.pop();
inOrder.push_back(p->val);
p=p->right;
}
}
}
void PostOrderIteratively(TreeNode* root){
if(!root)
return;
stack<TreeNode*> stk;
stk.push(root);
TreeNode* p=nullptr;
while(!stk.empty()){
p=stk.top();
stk.pop();
postOrder.insert(postOrder.begin(), p->val);
if(p->left)
stk.push(p->left);
if(p->right)
stk.push(p->right);
}
}
};