我們知道遞歸實際上是一個壓棧的操作,故要寫成非遞歸,我們需要利用棧。
前序:
/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public: vector<int> preorderTraversal(TreeNode* root) { vector<int>res; stack<TreeNode*>stk; auto p=root; while(p||stk.size()){ while(p){ res.push_back(p->val); stk.push(p); p=p->left; } if(stk.size()){ p=stk.top(); stk.pop(); p=p->right; } } return res; } };
中序:
/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public: vector<int> inorderTraversal(TreeNode* root) { stack<TreeNode*>stk; vector<int>res; auto p=root; while(p||stk.size()){ while(p){ stk.push(p); p=p->left; } p=stk.top(); stk.pop(); res.push_back(p->val); p=p->right; } return res; } };
后序:
/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public: vector<int> postorderTraversal(TreeNode* root) { vector<int>res; stack<TreeNode*>stk; TreeNode* p=root,*q=NULL; while(p||stk.size()){ if(p){ stk.push(p); p=p->left; }else{ p=stk.top(); if(p->right&&p->right!=q)p=p->right; else{ p=stk.top(); stk.pop(); res.push_back(p->val); q=p; p=NULL; } } } return res; } };