struct BiTNode {
char data;
BiTNode *lchild, *rchild;
};
typedef BiTNode* BiTree;
void PreOrder(BiTNode* r) { if(!r) return; visit(r); PreOrder(r->lchild); PreOrder(r->rchild); }
void InOrder (BiTNode* r) { if(!r) return; InOrder(r->lchild); visit(r); InOrder(r->rchild); }
void PostOrder(BiTNode* r){ if(!r) return; PostOrder(r->lchild); PostOrder(r->rchild); visit(r); }
void PreOrder_NR(BiTree T) {
if(!T) return;
stack<BiTree> s; s.push(T);
while(!s.empty()) {
BiTree p = s.top(); s.pop();
visit(p);
if(p->rchild) s.push(p->rchild); // 右先入
if(p->lchild) s.push(p->lchild); // 左後入 → 先出
}
}
void InOrder_NR(BiTree T) {
stack<BiTree> s; BiTree p = T;
while(p || !s.empty()) {
while(p) { s.push(p); p = p->lchild; }
p = s.top(); s.pop();
visit(p);
p = p->rchild;
}
}
void PostOrder_NR2(BiTree T) {
stack<BiTree> s1, s2; s1.push(T);
while(!s1.empty()) {
BiTree p = s1.top(); s1.pop();
s2.push(p);
if(p->lchild) s1.push(p->lchild);
if(p->rchild) s1.push(p->rchild);
}
while(!s2.empty()) { visit(s2.top()); s2.pop(); }
}
void LevelOrder(BiTree T) {
if(!T) return;
queue<BiTree> q; q.push(T);
while(!q.empty()) {
BiTree p = q.front(); q.pop();
visit(p);
if(p->lchild) q.push(p->lchild);
if(p->rchild) q.push(p->rchild);
}
}
max(h(l), h(r)) + 11 + cnt(l) + cnt(r)# 表示空見原文,包含菜單驅動主程序,可交互測試所有遍歷。