只要调整代码的[10,13]这4行的顺序就可以切换先序,中序,后序了
1.先序遍历
vector<int> preorderTraversal(TreeNode* root) {
if(root==nullptr)return {};
vector<int> res; //返回答案的数组
stack<TreeNode*> stk;
stk.push(root);
while(!stk.empty()){
TreeNode *cur=stk.top();
stk.pop();
if(cur!=nullptr){//先序遍历访问顺序:根节点-》左子树-》右子树 压栈顺序:右子树-》左子树-》根节点
if(cur->right)stk.push(cur->right); //10 因为栈先进后出,右子树最后访问,所以先压进去
if(cur->left)stk.push(cur->left); //11 接着压左子树
stk.push(cur); //12 然后才压根节点
stk.push(nullptr); //13 值为空指针的节点作用是标记
}else{//遇到值为空指针的节点,压在空指针下面的节点加入res数组
TreeNode *temp=stk.top();
stk.pop();
res.push_back(temp->val);
}
}
return res;
}
2.中序遍历
vector<int> inorderTraversal(TreeNode* root) {
if(root==nullptr)return {};
vector<int> res;
stack<TreeNode*> stk;
stk.push(root);
while(!stk.empty()){
TreeNode *cur=stk.top();
stk.pop();
if(cur!=nullptr){
if(cur->right)stk.push(cur->right);//10
stk.push(cur); //11
stk.push(nullptr); //12
if(cur->left)stk.push(cur->left); //13
}else{
TreeNode *temp=stk.top();
stk.pop();
res.push_back(temp->val);
}
}
return res;
}
扩展:二叉搜索树的中序遍历是一个递增数组,有些算法题会用到这个性质
3.后序遍历
Cvector<int> postorderTraversal(TreeNode* root) {
if(root==nullptr)return {};
vector<int> res;
stack<TreeNode*> stk;
stk.push(root);
while(!stk.empty()){
TreeNode *cur=stk.top();
stk.pop();
if(cur!=nullptr){
stk.push(cur); //10
stk.push(nullptr); //11
if(cur->right)stk.push(cur->right);//12
if(cur->left)stk.push(cur->left); //13
}else{
TreeNode *temp=stk.top();
stk.pop();
res.push_back(temp->val);
}
}
return res;
}