前序后中序遍历很好理解,代码相似,只不过换了一下push操作的位置,基本模板:
while( 栈非空 || p 非空){
if( p 非空){
}
else{
}
}
前序遍历
vector<int> preorderTraversal(TreeNode* root) {
vector<int> res;
stack<TreeNode*> save;
TreeNode* cur = root;
while(cur!=nullptr || save.size()!=0){
while(cur!=nullptr){
save.push(cur);
res.push_back(cur->val);
cur = cur->left;
}
cur = save.top();
save.pop();
cur = cur->right;
}
return res;
}
中序遍历
vector<int> inorderTraversal(TreeNode* root) {
if(root == nullptr)
return {};
stack<TreeNode*> save;
vector<int> res;
TreeNode* cur = root;
while(cur!=nullptr || save.size()!=0){
while(cur!=nullptr){
save.push(cur);
cur = cur->left;
}
cur = save.top();
save.pop();
res.push_back(cur->val);
cur=cur->right;
}
return res;
}
后序遍历
这里的后序遍历也通俗易懂,如果最后不reverse得到的是前序遍历的结果,不加reverse也是前序遍历的第二种非递归写法
vector<int> postorderTraversal(TreeNode* root) {
if(root == nullptr)
return {};
vector<int> ans;
stack<TreeNode*> save;
save.push(root);
while(!save.empty()){
TreeNode* temp = save.top();
save.pop();
ans.push_back(temp->val);
if(temp->left) save.push(temp->left);
if(temp->right) save.push(temp->right);
}
reverse(ans.begin(),ans.end());
return ans;
}