0001 template <typename T> void vine(Stack<BNP<T>>& S) { //展开起始于栈顶节点的藤 0002 for (BNP<T> x = S.top(); x; ) { //自顶而下,反复考查当前节点 0003 if (x->rc) S.push(x->rc); //右孩子先进后出 0004 if (x->lc) { S.push(x->lc); x = x->lc; } //若有左孩子,则优先左转 0005 else x = x->rc; //实不得已,才向右 0006 } //for 0007 } //vine 0008 template <typename T, typename V> void postorder1(BNP<T> x, V& visit) { 0009 Stack<BNP<T>> S; if (x) S.push(x); //辅助栈 0010 while (!S.empty()) { //x为刚被访问的节点(初始时可假想为x的左兄弟,它们的父亲为nullptr) 0011 if (S.top() != x->parent) //若栈顶非x之父(而为右兄) 0012 vine(S); //则在右兄子树中展开对应的藤(栈顶为eov) 0013 x = S.pop(); visit(x->data); //无论如何,接下来只需访问栈顶的节点 0014 } //while 0015 } //postorder1