C/C++ツリーの遍歴再帰と非再帰の実現
データ構造:
typedef char ElemType;
typedef struct BiTNode {
ElemType data;
struct BiTNode *lchild, *rchild;
} Node, *Tree;
中間パスの再帰的な実装:
void InOrderTraverse(Tree T, void (*Visit)(ElemType e)) {
if(T) {
InOrderTraverse(T->lchild,Visit);
Visit(T->data);
InOrderTraverse(T->rchild,Visit);
}
}
非再帰的なインプリメンテーション:
void InOrderTraverse2(Tree T, void (*Visit)(ElemType e)) {
stack<Node*> S;
Tree p;
p = T;
S.push(p);
while (p->lchild != NULL) {
p = p->lchild;
S.push(p);
}
while (!S.empty()) {
p = S.top();
Visit(p->data);
S.pop();
if (p->rchild != NULL) {
p=p->rchild;
S.push(p);
while (p->lchild != NULL) {
p = p->lchild;
S.push(p);
}
}
}
}