- 有句话说得好,一切递归皆可用栈来实现。关键是理解好递归以及栈的基本原理。
- 这里以最为典型的中序遍历为例,其他的实现类似
- 直接调用c++STL中的stack
- 树的知识点用到大量的递归知识,建议大家不太理解的去找一下典型二叉树的例子然后一一步的去遍历尝试一下算法
数据结构:
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);
}
}
}
}