非递归写法:
对一个节点来说,当遍历它时,要求它的右子树已经遍历完。
因此,为了判断当前节点到底需不需要遍历,引入pLast为上一次遍历的节点。
当pCur->right==pLast||pCur==NULL时,说明右子树已经遍历完了,应该遍历该节点了。
否则,说明该节点右子树尚未遍历,将右子树的根入栈,然后沿着左一直走到头(因为左永远是第一个遍历的)。
class Solution { public: void PostOrderTraver(TreeNode* root) { if(!root) return; stack<TreeNode*> aux; TreeNode* pLast=NULL; TreeNode* pCur=root; while(pCur) { aux.push(pCur); pCur=pCur->left; } while(!aux.empty()) { pCur=aux.top(); aux.pop(); if(pCur->right==NULL||pCur->right==pLast) { cout<<pCur->val<<endl; pLast=pCur; } else { aux.push(pCur); pCur=pCur->right; while(pCur) { aux.push(pCur); pCur=pCur->left; } } } return; } };
中序遍历:
class Solution { public: vector<int> inorderTraversal(TreeNode* root) { if(!root) return vector<int>(); vector<int> ans; stack<TreeNode*> aux; aux.push(root); while(!aux.empty()) { while(aux.top()) aux.push(aux.top()->left); aux.pop(); if(!aux.empty()) { ans.push_back(aux.top()->val); auto tmp=aux.top()->right; aux.pop(); aux.push(tmp); } } return ans; } };
前序遍历:
class Solution { public: vector<int> preorderTraversal(TreeNode* root) { vector<int> ans; if(!root) return ans; stack<TreeNode*> aux; aux.push(root); while(!aux.empty()) { while(aux.top()) { ans.push_back(aux.top()->val); aux.push(aux.top()->left); } aux.pop(); if(!aux.empty()) { auto it=aux.top()->right; aux.pop(); aux.push(it); } } return ans; } };