1. LeetCode144. 二叉树的前序遍历
2. LeetCode94. 二叉树的中序遍历
3. LeetCode145. 二叉树的后序遍历
1. LeetCode144. 二叉树的前序遍历
迭代法:
class Solution {
public:
vector<int> preorderTraversal(TreeNode* root) {
if(root==NULL)return {};
stack<TreeNode*>stk;
vector<int>res;
stk.push(root);
while(!stk.empty()){
TreeNode*node=stk.top();
stk.pop();
res.push_back(node->val);
//要让左节点先被弹出,所以后入栈
if(node->right)stk.push(node->right);
if(node->left)stk.push(node->left);
}
return res;
}
};
2. LeetCode94. 二叉树的中序遍历
迭代法:
class Solution {
public:
vector<int> inorderTraversal(TreeNode* root) {
stack<TreeNode*>stk;
vector<int>res;
TreeNode*cur=root;
while(cur!=NULL||!stk.empty()){
if(cur!=NULL){//指针访问节点,先到最底层
stk.push(cur);//将访问到的节点入栈
cur=cur->left;//左
}else{
cur=stk.top();//从栈里弹出的就是要处理的数据
stk.pop();
res.push_back(cur->val);//中
cur=cur->right;//右
}
}
return res;
}
};
3. LeetCode145. 二叉树的后序遍历
思路:
前序遍历数组顺序(中左右),后序遍历数组顺序(左右中),让前序遍历数组顺序变为(中右左),再反转数组
class Solution {
public:
vector<int> postorderTraversal(TreeNode* root) {
if(root==NULL)return {};
stack<TreeNode*>stk;
vector<int>res;
stk.push(root);
while(!stk.empty()){
TreeNode*node=stk.top();
stk.pop();
res.push_back(node->val);
if(node->left)stk.push(node->left);
if(node->right)stk.push(node->right);
}
reverse(res.begin(),res.end());
return res;
}
};