前序遍历 根左右 (将右节点压栈)
1.往左遍历记录当前值,并将右节点压栈
2.直到当前节点为空,取出栈顶右节点作为下一次循环起始
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
vector<int>ans;
vector<int> preorderTraversal(TreeNode* root) {
TreeNode* cur = root;
stack<TreeNode*>st;
while(cur||!st.empty()){
while(cur){
ans.push_back(cur->val);
st.push(cur->right);
cur = cur->left;
}
cur = st.top();
st.pop();
}
return ans;
}
};
后序遍历 左右根 通过翻转转换为跟右左
1.往右遍历记录当前值,并将左节点压栈
2.直到当前节点为空,取出栈顶左节点作为下一次循环起始
3.翻转结果
/**
* Definition for a binary tree node.
* struct TreeNodezhiu {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
vector<int>ans;
vector<int> postorderTraversal(TreeNode* root) {
TreeNode*cur = root;
stack<TreeNode*>st;
while(cur||!st.empty()){
while(cur){
ans.push_back(cur->val);
st.push(cur->left);
cur = cur->right;
}
cur = st.top();
st.pop();
}
reverse(ans.begin(),ans.end());
return ans;
}
};
中序遍历
1.左根右
2. 不断向左遍历,压栈
3. 当节点为空,取出栈顶,将栈顶节点值push_back到队列,往右节点走重复操作
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
//迭代版
vector<int>ans;
vector<int> inorderTraversal(TreeNode* root) {
TreeNode* cur =root;
stack<TreeNode*>s;
while(cur||!s.empty()){
//不断遍历左子树,放入栈
while(cur){
s.push(cur);
cur = cur->left;
}
//取出栈顶
cur = s.top();
s.pop();
//push栈顶值到结果vector
ans.push_back(cur->val);
//遍历右子树
cur = cur->right;
}
return ans;
}
};