template <typename T, typename VST>
void travPre_R(BinNodePosi(T) x, VST & visit)
{
if (x == nullptr) return;
visit(x->data);
travPre_R(x->lc, visit);
travPre_R(x->rc, visit);
}
template <typename T, typename VST>
void travIn_R(BinNodePosi(T) x, VST & visit)
{
if (x == nullptr) return;
travPre_R(x->lc, visit);
visit(x->data);
travPre_R(x->rc, visit);
}
template <typename T, typename VST>
void travPost_R(BinNodePosi(T) x, VST & visit)
{
if (x == nullptr) return;
travPre_R(x->lc, visit);
travPre_R(x->rc, visit);
visit(x->data);
}
template <typename T, typename VST>
void travPre_I1(BinNodePosi(T) x, VST & visit)
{
stack<BinNodePosi(T)> S;
if (x!=nullptr) S.push(x);
while (!S.empty())
{
x = S.pop(); visti(x->data);
if (x->rc != nullptr) S.push(x->rc);
if (x->lc != nullptr) S.push(x->lc);
}
}
template <typename T, typename VST>
static void visitAlongLeftBranch(BinNodePosi(T) x, VST & visit, Stack<BinNodePosi(T)> & S)
{
while (x != nullptr)
{
visit(x->data);
if (x->rc != nullptr) S.push(x->rc);
x = x->lc;
}
}
template <typename T, typename VST>
void travPre_I2(BinNodePosi(T) x, VST & visit)
{
Stack<BinNodePosi(T)> S;
while (1)
{
visitAlongLeftBranch(x, visit, S);
if (S.empty() == 1) break;
x = S.pop();
}
}
template <typename T>
static void goAlongLeftBranch(BinNodePosi(T) x, Stack<BinNodePosi(T)> & S)
{
while (x != nullptr) { S.push(x); x = x->lc; }
}
template <typename T, typename VST>
void travIn_I1(BinNodePosi(T) x, VST & visit)
{
Stack<BinNodePosi(T)> S;
while (1)
{
goAlongLeftBranch(x, S);
if (S.empty()) break;
x = S.pop(); visit(x->data);
x = x->rc;
}
}
template <typename T, typename VST>
void travIn_I2(BinNodePosi(T) x, VST & visit)
{
Stack<BinNodePosi(T)> S;
while (1)
{
if (x != nullptr)
{
S.push(x);
x = x->lc;
}
else if (!S.empty())
{
x = S.pop();
visit(x->data);
x = x->rc;
}
else break;
}
}
template <typename T> BinNodePosi(T) BinNode<T>::succ()
{
BinNodePosi(T) s = this;
if (s->rc != nullptr)
{
s = rc;
while (s->lc != nullptr) { s = s->lc; }
}
else
{
while (s->parent->rc == s) s = s->parent;
s = s->parent;
}
return s;
}
template <typename T, typename VST>
void travIn_I3(BinNodePosi(T) x, VST & visit)
{
bool backtrack = false;
while (1)
{
if (!backtrack && x->lc != nullptr)
{
x = x->lc;
}
else
{
visit(x->data);
if (x->rc != nullptr)
{
x = x->rc;
backtrack = false;
}
else
{
x = x->succ();
if (x == nullptr) break;
backtrack = 1;
}
}
}
}
template <typename T>
static void gotoHLVFL(Stack < BinNodePosi(T) & S)
{
while (BinNodePosi(T) x = S.top())
{
if (x->lc != nullptr)
{
if (x->rc != nullptr) S.push(x->rc);
S.push(x->lc);
}
else
{
S.push(x->rc);
}
}
S.pop();
}
template <typename T, typename VST>
void travPost_I(BinNodePosi(T) x, VST& visit)
{
Stack<BinNodePosi(T)> S;
if (x != nullptr) S.push(x);
while (!S.empty())
{
if (S.top() != x->parent)
gotoHLVFL(S);
x = S.pop(); visit(x->data);
}
}
template <typename T, typename VST>
void BinNode<T>::travLevel(VST & visit)
{
Queue<BinNodePosi(T)> Q;
Q.enqueue(this);
while (!Q.empty())
{
BinNodePosi(T) x = Q.dequeue(); visit(x->data);
if (x->lc != nullptr) Q.enqueue(x->lc);
if (x->rc != nullptr) Q.enqueue(x->rc);
}
}