1、前序遍历
// 递归版
void PreOrder(BiTree T){
if(T!=NULL){
printf("%d ",T->data);
PreOrder(T->lchild);
PreOrder(T->rchild);
}
}
// 非递归版
void PreOrder2(BiTree T){
InitStack(s);
BiTree *p=T;
while(p!=NULL || !IsEmpty(s)){
if(p!=NULL){
printf("%d ",p->data);
Push(s,p->lchild);
p=p->lchild;
} else {
Pop(s,p);
p=p->rchild;
}
}
}
2、中序遍历
// 递归版
void InOrder(BiTree T){
if(T!=NULL){
InOrder(T->lchild);
printf("%d ",T->val);
InOrder(T->rchild);
}
}
// 非递归版
void InOrder(BiTree T){
InitStack(s);
BiTree *p=T;
while(p!=NULL || !IsEmpty(s)){
if(p!=NULL){
Push(s,p);
p=p->lchild;
} else {
Pop(s,p);
printf("%d ",p);
p=p->lchild;
}
}
}
3、后序遍历
void PostOrder(BiTree T){
if(T!=NULL){
PostOrder(T->lchild);
PostOrder(T->rchild);
printf("%d ",T->data);
}
}
// 非递归版
void PostOrder(BiTree T){
InitStack(s);
BiTree *p=T,*r=NULL;
while(p!=NULL || !IsEmpty(s)){
if(p!=NULL){
Push(s,p);
p=p->lchild;
} else {
GetTop(s,p);
if(p->rchild!=NULL && p->rchild!=r){
p=p->rchild;
} else {
Pop(s,p);
printf("%d ",p->val);
r=p;
p=NULL;
}
}
}
}
4、层序遍历
void LevelOrder(BiTree T){
InitQueue(q);
BiTree *p=T;
EnQueue(q,p);
while(!IsEmpty(q)){
DeQueue(s,p);
printf("%d ",p->val);
if(p->lchild!=NULL) EnQueue(q,p->lchild);
if(p->rchild!=NULL) EnQueue(q,p->rchild);
}
}