1。各种遍历
1)中序
void InOrder(BiTree T){
// 创建栈
BiTree s[maxsize];
int top = -1; // 初始化
BiTree p = T;
while(p || top != -1){ // 栈不空
if(p) { // 根节点进栈,遍历左子树
s[++top] = p;
p = p->lchild;
}
else {
p = s[top--];
visit(p);
p = p->rchild;
}
}
}
2)先序
const int maxsize = 100;
typedef struct BiNode{
struct BiNode * lchild, rchild;
int data;
}BiNode, *BiTree;
// 这个由层序修改而来
void PreOrder(BiTree T){
if(T == NULL) return;
// 创建栈
BiTree s[maxsize];
int top = -1; // 初始化
s[++top] = T; // 根节点进栈
while(top != -1){ // 栈不空
BiTree p = s[top--];
visit(p);
if(p->lchild != NULL)
s[++top] = p->lchild;
if(p->cchild != NULL)
s[++top] = p->rchild;
}
}
// 下面一个是由中序修改得来
void PreOrder(BiTree T){
// 创建栈
int s[maxsize] = {0};
int top = -1; // 初始化
BiTree p = T;
while(p || top != -1){ // 栈不空
if(p) { // 根节点进栈,遍历左子树
visit(p);
s[++top] = p;
p = p->lchild;
}
else {
p = s[top--];
p = p->rchild;
}
}
}
3)后序
const int maxsize = 100;
typedef struct{
BiNode *p;
int visited; // 1表示右节点被访问过
}SNode; // 元素结构
typedef struct { // 栈结构
SNode elem[maxsize];
int top;
}s;
void PostOrder(BiTree T) {
SNode sn;
s.top = -1;
BiNode *p = T;
while(T) { // 一路向左下走
s.elem[++s.top].p = p;
s.elem[s.top].visited = 0;
p = p->lchild;
}
while(s.top != -1) {
sn = s.elem[s.top]; // 访问栈顶
if(sn.p->rchild != NULL || sn.visited) {
s.top--;
visit(sn.p);
}
else {
sn.visited = 1;
p = sn.p->rchild;
while(p != NULL) {
s.elem[++s.top].p = p;
p = p->lchild;
}
}
}
}
4)层序
const int maxsize = 100;
void level(BiTree T) {
BiTree q[maxsize];
int front, rear;
front = rear = -1;
q[++rear] = T;
while(front < rear) {
BiTree p = q[++front];
visit(p);
if(p->lchild != NULL)
q[++rear] = p->lchild;
if(p->rchild != NULL)
q[++rear] = p->rchild;
}
}