反正暴力不拿offer的,复习举一反三的迭代遍历,对于树,一定要有对局部节点和整体树的思考。有空复习莫里斯遍历
struct TreeNode
{
int val;
TreeNode* left;
TreeNode* right;
};
vector<int> preOrderIterationBTree(TreeNode* head){
vector<int> res;
stack<TreeNode*> s;
TreeNode* node = head;
while(node!=nullptr || !s.empty()){
while(node!=nullptr){
res.push_back(node->val);
s.push(node);
node = node->left;
}
node = s.top();
s.pop();
node = node->right;
}
return res;
}
vector<int> preOrderIterationBTree2(TreeNode* head){
vector<int> res;
stack<TreeNode*> s;
TreeNode* node = head;
s.push(node);
while(!s.empty()){
node = s.top();
s.pop();
res.push_back(node->val);
if(node->right != nullptr){
s.push(node->right);
}
if(node->left != nullptr){
s.push(node->left);
}
}
return res;
}
vector<int> inOrderIterationBTree(TreeNode* head){
vector<int> res;
stack<TreeNode*> s;
TreeNode* node = head;
while(node!=nullptr || !s.empty()){
while(node!=nullptr){
s.push(node);
node = node->left;
}
node = s.top();
s.pop();
res.push_back(node->val);
node = node->right;
}
return res;
}
vector<int> postOrderIterationBTree(TreeNode* head){
vector<int> res;
stack<TreeNode*> s1;
stack<TreeNode*> s2;
TreeNode* node = head;
s1.push(node);
while(!s1.empty()){
node = s1.top();
s1.pop();
s2.push(node);
if(node->left != nullptr){
s1.push(node->left);
}
if(node ->right != nullptr){
s1.push(node->right);
}
}
while(!s2.empty()){
TreeNode* temp = s2.top();
s2.pop();
res.push_back(temp->val);
}
return res
}