二叉链树的先序递归算法:
void PreOrderTraverse(BiTree T) {
//如果二叉树存在,则遍历二叉树
if (T) {
printf("%d",T->data); //调用操作结点数据的函数方法
PreOrderTraverse(T->lchild);//访问该结点的左孩子
PreOrderTraverse(T->rchild);//访问该结点的右孩子
}
}
二叉链树的先序非递归算法:
void PreOrder(BiTree t){
BiTree stack[MAX],q;
int top=0,i;
for(i=0;i<MAX;i++){
stack[i]=NULL;
}
q=t;
while(q!=NULL){
printf("%c",q->data);
if(q->rchild!=NULL){
stack[top++]=q->rchild;
}
if(q->lchild!=NULL){
q=q->lchild;
}else if(top>0){
q=stack[--top];
}else{
q=NULL;
}
}
}
二叉链树的中序递归遍历:
void INOrderTraverse(BiTree T) {
if (T) {
INOrderTraverse(T->lchild);//遍历当前结点的左子树
printf("%d ",T->data); //访问当前结点
INOrderTraverse(T->rchild);//遍历当前结点的右子树
}
}
二叉链树的中序非递归遍历:
void InOrder(BiTree t){
BiTree stack[MAX],p;
int top=0,i;
for(i=0;i<MAX;i++){
stack[i]=NULL;
}
p=t;
while(p!=NULL||top>0){
while(p){
stack[top++]=p;
p=p->lchild;
}
p=stack[--top];
printf("%c",p->data);
p=p->rchild;
}
}
二叉链树的后序递归遍历:
void postorder(BiTree t){
if(t!=NULL){
postorder(t->lchild);
postorder(t->rchild);
printf("%c",t->data);
}
}
二叉链树的后序非递归遍历:
void PostOrder(BiTree t){
BiTree stack[MAX],q;
int i,top=0,flag[MAX];
for(i=0;i<MAX;i++){
stack[i]=NULL;
flag[i]=0;
}
q=t;
while(q!=NULL||top!=0){
if(q!=NULL){
stack[top]=q;
flag[top]=0;
top++;
q=q->lchild;
}else{
while(top){
if(flag[top-1]==0){
q=stack[top-1];
q=q->rchild;
flag[top-1]=1;
break;
}else{
q=stack[--top];
printf("%c",q->data);
}
}
}
if(top==0) break;
}
}
二叉链树的层次遍历:
void levelOrder(BiTree t){
BiTree p;
SqQueue qlist,*q;
q=&qlist;
q->front=0;
q->rear=0;
p=t;
if(p!=NULL){
printf("%c",p->data);
q->data[q->rear]=p;
q->rear=(q->rear+1)%MAX;
while(q->front!=q->rear){
p=q->data[q->front];
q->front=(q->front+1)%MAX;
if(p->lchild!=NULL){
printf("%c",p->lchild->data);
q->data[q->rear]=p->lchild;
q->rear=(q->rear+1)%MAX;
}
if(p->rchild!=NULL){
printf("%c",p->rchild->data);
q->data[q->rear]=p->rchild;
q->rear=(q->rear+1)%MAX;
}
}
}
}