二叉树遍历—非递归
前序遍历
vector<int> preorderTraversal(TreeNode* root) {
vector<int> res;
if(!root) return res;
stack<TreeNode*> stk;
stk.push(root);
while(!stk.empty()){
TreeNode* temp = stk.top();
stk.pop();
res.push_back(temp->val);
if(temp->right){
stk.push(temp->right); //栈先进后出,右孩子先入栈
}
if(temp->left){
stk.push(temp->left);
}
}
return res;
}
中序遍历
vector<int> inorderTraversal(TreeNode* root) {
vector<int> res;
if(!root)
return res;
stack<TreeNode*> stk;
TreeNode* cur = root;
while(cur || !stk.empty()){ // 初始时stk为空
if(cur){ // 存在left则left入栈,也可用while;
stk.push(cur);
cur = cur->left;
}
if(cur == nullptr){
cur = stk.top();
stk.pop();
res.push_back(cur->val);
cur = cur->right;
}
}
return res;
}
后序遍历
vector<int> postorderTraversal(TreeNode* root) {
vector<int> res;
if(!root)
return res;
TreeNode* cur = root;
stack<TreeNode*> stk1;
stack<TreeNode*> stk2; //存放后序遍历的逆序
stk1.push(root);
while(!stk1.empty()){
cur = stk1.top();
stk1.pop();
stk2.push(cur);
if(cur->left){ // 先left后right与先序相反
stk1.push(cur->left);
}
if(cur->right){
stk1.push(cur->right);
}
}
while(!stk2.empty()){
res.push_back(stk2.top()->val);
stk2.pop();
}
return res;
}
直接使用reverse
vector<int> postorderTraversal(TreeNode* root) {
vector<int> res;
if(!root)
return res;
TreeNode* cur = root;
stack<TreeNode*> stk;
stk.push(root);
while(!stk.empty()){
cur = stk.top();
stk.pop();
res.push_back(cur->val); //存放的后序遍历的逆序
if(cur->left){
stk.push(cur->left);
}
if(cur->right){
stk.push(cur->right);
}
}
reverse(res.begin(), res.end());
return res;
}