最近在整理常用到的算法,想到了之前看到的一篇题解,通过标记已处理的中节点的方法实现了统一风格的前中后序遍历,忘记在哪里看到的了,磕磕绊绊自己实现了一遍,这里记录一下
对应题目:NC45 实现二叉树先序,中序和后序遍历
代码实现
/**
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
class Solution {
public:
vector<int> preOrder(TreeNode* root){
vector<int> ans;
stack<TreeNode*> s;
if(root) s.push(root);
while(!s.empty()) {
TreeNode* node = s.top();
if(node) {
s.pop();
if(node->right) s.push(node->right);//right
if(node->left) s.push(node->left);//left
s.push(node);//mid
s.push(NULL);
} else {
s.pop();
node = s.top();
s.pop();
ans.push_back(node->val);
}
}
return ans;
}
vector<int> midOrder(TreeNode* root){
vector<int> ans;
stack<TreeNode*> s;
if(root) s.push(root);
while(!s.empty()) {
TreeNode* node = s.top();
if(node) {
s.pop();
if(node->right) s.push(node->right);//right
s.push(node);//mid
s.push(NULL);
if(node->left) s.push(node->left);//left
} else {
s.pop();
node = s.top();
s.pop();
ans.push_back(node->val);
}
}
return ans;
}
vector<int> postOrder(TreeNode* root){
vector<int> ans;
stack<TreeNode*> s;
if(root) s.push(root);
while(!s.empty()) {
TreeNode* node = s.top();
if(node) {
s.pop();
s.push(node);//mid
s.push(NULL);
if(node->right) s.push(node->right);//right
if(node->left) s.push(node->left);//left
} else {
s.pop();
node = s.top();
s.pop();
ans.push_back(node->val);
}
}
return ans;
}
/**
*
* @param root TreeNode类 the root of binary tree
* @return int整型vector<vector<>>
*/
vector<vector<int> > threeOrders(TreeNode* root) {
// write code here
if(!root) return {{}, {}, {}};
return {preOrder(root), midOrder(root), postOrder(root)};
}
};