加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

实验      实现二叉树各种遍历算法

(2012-10-14 17:48:50)

实现二叉树各种遍历算法

编写一个程序,实现二叉树的先序遍历,中序遍历和后序遍历的俄中递归和非递归算法,以及层次遍历的算法。

 

 

#include<stdio.h>
#include<malloc.h>

#define MaxSize 100

typedef char ElemType;
typedef struct node{
    ElemType data;      //数据元素
    struct node *lchild;        //指向左孩子
    struct node *rchild;        //指向右孩子
}BTNode;

void CreateBTNode(BTNode *&b,char *str){    //由str串创建二叉链
    BTNode *St[MaxSize],*p=NULL;
    int top=-1,k,j=0;
    char ch;
    b=NULL;     //建立的二叉树初始时为空
    ch=str[j];
    while(ch!='\0'){    //str未扫描完时循环
        switch(ch){
            case '(':St[top]=p;k=1;break;   //为左结点
            case ')':top--;break;
            case ',':k=2;break;     //为右结点
            default :p=(BTNode *)malloc(sizeof(BTNode));
                    p->data=ch;
                    p->lchild=p->rchild=NULL;
                    if(b==NULL)
                        b=p;        //p指向二叉树的根结点
                    else{       //已建立二叉树根结点
                        switch(k){
                            case 1:St[top]->lchild=p;break;
                            case 2:St[top]->rchild=p;break;
                        }
                    }
        }
        j++;
        ch=str[j];
    }
}

void DispBTNode(BTNode *b){     //以括号表示法输出二叉树
    if(b!=NULL){
        printf("%c",b->data);
        if(b->lchild!=NULL || b->rchild!=NULL){
            printf("(");
            DispBTNode(b->lchild);
            if(b->rchild!=NULL)
                printf(",");
            DispBTNode(b->rchild);
            printf(")");
        }
    }
}

void PreOrder(BTNode *b){       //先序遍历的递归算法
    if(b!=NULL){
        printf("%c ",b->data);   //访问根结点
        PreOrder(b->lchild);    //递归访问左子树
        PreOrder(b->rchild);    //递归访问右子树
    }
}

void PreOrder1(BTNode *b){      //先序遍历的非递归算法
    BTNode *St[MaxSize],*p;
    int top=-1;
    if(b!=NULL){
        top++;      //根结点入栈
        St[top]=b;
        while(top>-1){      //栈不空时循环
            p=St[top];      //退栈并访问该结点
            top--;
            printf("%c ",p->data);
            if(p->rchild!=NULL){    //右孩子入栈
                top++;
                St[top]=p->rchild;
            }
            if(p->lchild!=NULL){    //左孩子入栈
                top++;
                St[top]=p->lchild;
            }
        }
        printf("\n");
    }
}

void InOrder(BTNode *b){    //中序遍历的递归算法
    if(b!=NULL){
        InOrder(b->lchild);     //递归访问左子树
        printf("%c ",b->data);   //访问根结点
        InOrder(b->rchild);     //递归访问右子树
    }
}

void InOrder1(BTNode *b){       //中序遍历的非递归算法
    BTNode *St[MaxSize],*p;
    int top=-1;
    if(b!=NULL){
        p=b;
        while(top>-1 || p!=NULL){
            while(p!=NULL){
                top++;
                St[top]=p;
                p=p->lchild;
            }
            if(top>-1){
                p=St[top];
                top--;
                printf("%c ",p->data);
                p=p->rchild;
            }
        }
        printf("\n");
    }
}

void PostOrder(BTNode *b){      //后序遍历的递归算法
    if(b!=NULL){
        PostOrder(b->lchild);   //递归访问左子树
        PostOrder(b->rchild);   //递归访问右子树
        printf("%c ",b->data);   //访问根结点
    }
}

void PostOrder1(BTNode *b){      //后续遍历的非递归算法
    BTNode *St[MaxSize];
    BTNode *p;
    int flag,top=-1;        //站指针置初值
    if(b!=NULL){
        do{
            while(b!=NULL){     //将t的所有左结点入栈
                top++;
                St[top]=b;
                b=b->lchild;
            }
            p=NULL;     //p指向当前结点的前一个已访问的结点
            flag=1;     //设置b的访问标记为已访问过
            while(top!=-1 && flag){
                b=St[top];      //取出当前的栈顶元素
                if(b->rchild==p){   //右子树不存在或已被访问,访问之
                    printf("%c ",b->data);   //访问*b结点
                    top--;
                    p=b;        //p指向刚被访问的结点
                }else{
                    b=b->rchild;    //b指向右子树
                    flag=0; //设置未被访问的标记
                }
            }
        }while(top!=-1);
        printf("\n");
    }
}

void TravLevel(BTNode *b){  //层次遍历
    BTNode *Qu[MaxSize];    //定义顺序循环队列
    int front,rear;     //定义队首和队尾指针
    front=rear=0;       //置队列为空队列
    if(b!=NULL)
        printf("%c ",b->data);
    rear++;     //结点指针进入队列
    Qu[rear]=b;
    while(rear!=front){     //队列不为空
        front=(front+1)%MaxSize;
        b=Qu[front];        //队头出队列
        if(b->lchild!=NULL){    //输出左孩子,并入队列
            printf("%c ",b->lchild->data);
            rear=(rear+1)%MaxSize;
            Qu[rear]=b->lchild;
        }
        if(b->rchild!=NULL){    //输出右孩子,并入队列
            printf("%c ",b->rchild->data);
            rear=(rear+1)%MaxSize;
            Qu[rear]=b->rchild;
        }
    }
    printf("\n");
}

int main(){
    BTNode *b;
    CreateBTNode(b,"A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I)))");
    printf("二叉树b:");DispBTNode(b);printf("\n\n");
    printf("层次遍历序列:");
    TravLevel(b);
    printf("\n");
    printf("先序遍历序列:\n");
    printf("   递归算法:");PreOrder(b);printf("\n");
    printf(" 非递归算法:");PreOrder1(b);printf("\n");
    printf("中序遍历算法:\n");
    printf("   递归算法:");InOrder(b);printf("\n");
    printf(" 非递归算法:");InOrder1(b);printf("\n");
    printf("后序遍历算法:\n");
    printf("   递归算法:");PostOrder(b);printf("\n");
    printf(" 非递归算法:");PostOrder1(b);printf("\n");
    return 0;
}

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有