前序遍历递归非递归1234567891011121314151617181920212223242526class Solution {public: vector<int> preorderTraversal(TreeNode* root) { if(!root) { return vector<int>(); } stack<TreeNode*> S; vector<int> preOrder; TreeNode* p = root; while(!S.empty() || p) { while(p) { preOrder.emplace_back(p->val); S.emplace(p); p = p->left; } p = S.top(); S.pop(); p = p->right; } return preOrder; }}; 中序遍历递归非递归12345678910111213141516171819202122class Solution {public: vector<int> inorderTraversal(TreeNode* root) { stack<TreeNode*> stk; vector<int> inOrder; TreeNode* p = root; while(!stk.empty() || p) { while(p) { stk.emplace(p); p = p->left; } p = stk.top(); stk.pop(); inOrder.emplace_back(p->val); p = p->right; } return inOrder; }}; 后序遍历递归非递归12345678910111213141516171819202122232425262728293031// leetcodevector<int> postorderTraversal(TreeNode* root) { stack<TreeNode*> stk; vector<int> postOrder; TreeNode* prev = nullptr; while(!stk.empty() || root != nullptr) { // 向左至子树最左侧 while(root != nullptr) { stk.emplace(root); root = root->left; } // 取子树最左侧的节点 root = stk.top(); // stk.pop(); // 检查当前节点是否有右子树或右子树是否已访问 if(root->right == nullptr || root->right == prev) { postOrder.emplace_back(root->val); prev = root; root = nullptr; stk.pop(); // 确定右子树已访问后,栈顶元素出栈 } else { // stk.emplace(root); root = root->right; } } return postOrder;} --- 12345678910111213141516171819202122232425262728293031// 左程云void PostOrder( BiTree T){ InitStack(S); p=T; r=NULL; while(p || !IsEmpty(S)) { if (p){ //走到最左边 push(S,p); p=p->lchild; } else { GetTop(S,p); //向右,取栈顶结点。 if (p->rchild && p->rchild!=r) //若右子树存在,且未被访问过 { p = p->rchild; //转向右 push(S,p); //压栈 p = p->lchild; //再走到最左 } else { //否则,弹出结点并访问 pop(S,p); //将结点弹出 visit(p->data); //访问该结点 r = p; //记录最近访问过的结点 p = NULL; //结点访问完后,重置p指针 } } }}