//非遞歸算法后序遍歷二叉樹 void PostOrder1(BTNode *b) { BTNode *St[MaxSize];BTNode *p;int top = -1; //建立棧並初始化 BTNode *r; //保存前一個訪問的結點 bool flag; p = b; //p指向根節點 do { while(p != NULL) //讀取當前結點及其所有左下結點 { St[++top] = p; p = p->lchild; } r = NULL; //每一次循環開始,初始化r flag = true; //表示當前處理的是棧頂結點 while(top != -1 && flag) { p = St[top]; //取棧頂元素 if(p->rchild == r) //當前棧頂元素右孩子已經被訪問過或者為空,說明右子樹遍歷完,然后訪問當前結點並出棧 { cout<<p->data; r = p; top--; } else //轉向右子樹 { p = p->rchild; flag = false; //表似乎當前處理的是右子樹 } } }while(top != -1); }