栈+颜色标记法,刷题小能手++
/**
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
#define WHITE 0
#define GRAY 1
class Solution {
public:
/**
*
* @param root TreeNode类 the root of binary tree
* @return int整型vector<vector<>>
*/
vector<vector<int>> threeOrders(TreeNode* root) {
// write code here
vector<int> preoder = preorderVisit(root);
vector<int> inorder = inorderVisit(root);
vector<int> postorder = postorderVisit(root);
return vector<vector<int>>{preoder,inorder,postorder};
}
vector<int> preorderVisit(TreeNode* root) {
vector<int> res = vector<int>();
vector<tuple<int,TreeNode*>> stack = vector<tuple<int,TreeNode*>>();
if(root!=nullptr) {
stack.push_back(tuple<int,TreeNode*>(WHITE,root));
}
while (stack.size()>0){
tuple<int,TreeNode*> top = stack.back();
stack.pop_back();
if(std::get<0>(top)==WHITE) {
TreeNode* current = std::get<1>(top);
if(current->right!=nullptr) {
stack.push_back(tuple<int,TreeNode*>(WHITE,current->right));
}
if(current->left!=nullptr) {
stack.push_back(tuple<int,TreeNode*>(WHITE,current->left));
}
stack.push_back(tuple<int,TreeNode*>(GRAY,current));
}else{
res.push_back(std::get<1>(top)->val);
}
}
return res;
}
vector<int> inorderVisit(TreeNode* root) {
vector<int> res = vector<int>();
vector<tuple<int,TreeNode*>> stack = vector<tuple<int,TreeNode*>>();
if(root!=nullptr) {
stack.push_back(tuple<int,TreeNode*>(WHITE,root));
}
while (stack.size()>0){
tuple<int,TreeNode*> top = stack.back();
stack.pop_back();
if(std::get<0>(top)==WHITE) {
TreeNode* current = std::get<1>(top);
if(current->right!=nullptr) {
stack.push_back(tuple<int,TreeNode*>(WHITE,current->right));
}
stack.push_back(tuple<int,TreeNode*>(GRAY,current));
if(current->left!=nullptr) {
stack.push_back(tuple<int,TreeNode*>(WHITE,current->left));
}
}else{
res.push_back(std::get<1>(top)->val);
}
}
return res;
}
vector<int> postorderVisit(TreeNode* root) {
vector<int> res = vector<int>();
vector<tuple<int,TreeNode*>> stack = vector<tuple<int,TreeNode*>>();
if(root!=nullptr) {
stack.push_back(tuple<int,TreeNode*>(WHITE,root));
}
while (stack.size()>0){
tuple<int,TreeNode*> top = stack.back();
stack.pop_back();
if(std::get<0>(top)==WHITE) {
TreeNode* current = std::get<1>(top);
stack.push_back(tuple<int,TreeNode*>(GRAY,current));
if(current->right!=nullptr) {
stack.push_back(tuple<int,TreeNode*>(WHITE,current->right));
}
if(current->left!=nullptr) {
stack.push_back(tuple<int,TreeNode*>(WHITE,current->left));
}
}else{
res.push_back(std::get<1>(top)->val);
}
}
return res;
}
};