一个比较好的博客
https://blog.csdn.net/u011567017/article/details/57075251/
递归的做法不需要讲,无脑
迭代的版本都是用栈来做的.....
前序的迭代版本:首先是先压入右节点,然后压入左节点
后序的迭代版本:首先是先压入左节点,然后压入右节点 得到的序列是中右左,接下逆序输出就可以得到左右中了
中序的迭代版本:注意while的条件是栈为空且指向null
1.若其左孩子不为空,则将p入栈并将p的左孩子置为当前的p,然后对当前结点p再进行相同的处理;
2.若其左孩子为空,则取栈顶元素并进行出栈操作,访问该栈顶结点,然后将栈顶结点的右孩子置为当前的p
3.直到p为null且栈为空则结束遍历
先序
class Solution {
public:
vector<int> preorderTraversal(TreeNode* root) {
if(root == NULL) return vector<int>();
vector<int> res;
stack<TreeNode*> m_stack;
m_stack.push(root);
while(m_stack.size()){
TreeNode* cur = m_stack.top();
res.push_back(cur->val);
m_stack.pop();
if(cur->right!=NULL){
m_stack.push(cur->right);
}
if(cur->left!=NULL){
m_stack.push(cur->left);
}
}
return res;
}
};
中序
//中序版本
class Solution {
public:
vector<int> inorderTraversal(TreeNode* root) {
if(root==NULL) return vector<int>();
stack<TreeNode*> m_stack;
TreeNode* head = root;
vector<int> res;
while(m_stack.size() || head){ //注意点
if(head){
m_stack.push(head);
head = head->left;
}else{
head = m_stack.top();
m_stack.pop();
res.push_back(head->val);
head = head->right;
}
}
return res;
}
};
后序
class Solution {
public:
vector<int> postorderTraversal(TreeNode* root) {
if(root==NULL) return vector<int>();
vector<int> res;
stack<TreeNode*> m_stack;
m_stack.push(root);
while(m_stack.size()){
TreeNode* cur = m_stack.top();
m_stack.pop();
res.push_back(cur->val);
if(cur->left!=NULL){
m_stack.push(cur->left);
}
if(cur->right!=NULL){
m_stack.push(cur->right);
}
}
reverse(res.begin(),res.end());
return res;
}
};