轉載:【刷題】二叉樹非遞歸遍歷html
stack<Node*> st; void preOrder(Node* root) { Node *cur = root; while (cur || !st.empty()) { while (cur) { //訪問、入棧、轉向左孩子 pre.push_back(cur->data); st.push(cur); cur = cur->lchild; } if (!st.empty()) { //出棧、轉向右孩子 cur = st.top(); st.pop(); cur = cur->rchild; } } } void inOrder(Node* root) { Node *cur = root; while (cur || !st.empty()) { while (cur) { //入棧、轉向左孩子 st.push(cur); cur = cur->lchild; } if (!st.empty()) { //出棧、訪問、轉向右孩子 cur = st.top(); st.pop(); in.push_back(cur->data); cur = cur->rchild; } } } void postOrder(Node* root) { Node *cur = root, *pre = NULL;//pre指向上一個被訪問過的節點 while (cur || !st.empty()) { while (cur) { //入棧、轉向左孩子 st.push(cur); cur = cur->lchild; } if (!st.empty()) { //有條件的出棧, cur = st.top(); // 若是已經訪問了右子樹,則能夠訪問根節點;不然轉向,先去訪問右子樹 if (cur->rchild == NULL || cur->rchild == pre) { st.pop(); post.push_back(cur->data); pre = cur; cur = NULL;// 表示不須要轉向,繼續彈棧 } else { //轉向 cur = cur->rchild; } } } }
下面這種寫法和筆記中的是統一的post
https://blog.csdn.net/u013161323/article/details/53925313spa
void PostOrder(TreeNode *root) { TreeNode *p = root, *r = NULL; stack<TreeNode*> s; while (p || !s.empty()) { if (p) {//走到最左邊 s.push(p); p = p->left; } else { p = s.top(); if (p->right && p->right != r)//右子樹存在,未被訪問 p = p->right; else { s.pop(); visit(p->val); r = p;//記錄最近訪問過的節點 p = NULL;//節點訪問完後,重置p指針 } }//else }//while }