免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 752 | 回复: 0
打印 上一主题 下一主题

请教各位有关二叉树的问题!! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2004-05-23 18:27 |只看该作者 |倒序浏览
/*此程序主要是训练二叉树的生成,遍历(输出),包括用栈和
不用栈,另外借助层次遍历方法交换左右子树,但目前用栈还末
实现!初步判断是:栈有关的问题!现象是:一下子给栈用满
了!(在TC下调试)*/
#define OVERFLOW  -2
#define INFEASIBLE -1
#define ERROR 0
#define OK 1
#define FALSE 0
#define TRUE 1
typedef int Status;
#include "stdio.h"
#define Stack_INIT_S 30
#define MaxNode 30
typedef char TElemType;
typedef struct BiTNode{
        TElemType data;
        struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
typedef struct Stack{
        BiTree base;
        BiTree top;
        int stacksize;
}SqStack;
FILE *fp;
Status (*Visit)();
Status PrintElement(TElemType e);
Status CreateBiTree(BiTree *T);
Status InOrderTraverse_1(BiTree T);
Status LevelOrder(BiTree T);
Status LevelOrderSwap(BiTree T);

void main(void)
{
        BiTree T=NULL;
        clrscr();
        if ((fp=fopen("d:\\chen\\dataBT.txt","r")==NULL)
        {
                puts("Can not open the data file!";
                exit(ERROR);
        }
        /* 运行是注意在“d:\chen\dataBT.txt”中有数据如下:
        abdhn**o**ip***ejq***k**cf**glr**s**mt***
        */
        CreateBiTree(&T);
        fclose(fp);
        puts("LevelOrderTraverse";
        LevelOrder(T);
        puts(" \nAfter Swaping (shell LevelOrderSwap() )!";
        LevelOrderSwap(T);/*用层次遍历来实施交换!*/
        LevelOrder(T);        putchar('\n');
        /*以下是有错误的函数(InOrderTraverse_2(T)和InOrderTraverse_1(T)
        调用不成功!错误何在呀?)*/
/*        puts("InOrderTraverse_2(with Stack ):";
        InOrderTraverse_2(T);        putchar('\n');
*/        puts("InOrderTraverse_1(with Stack ):";
        InOrderTraverse_1(T);        putchar('\n');
        puts("\nThe end";        getch();
}
Status LevelOrder(BiTree T)
/*层次遍历二叉树,借助了队列!*/
{
        BiTree queue[MaxNode];
        int front,rear;
        Visit=PrintElement;
        if(T==NULL)
                return FALSE;
        front=-1;
        rear=0;
        queue[rear]=T;
        while(front!=rear)
        {
                front++;
                Visit(queue[front]->;data);
                if(queue[front]->;lchild!=NULL)
                {
                        rear++;
                        queue[rear]=queue[front]->;lchild;
                }
                if(queue[front]->;rchild!=NULL)
                {
                        rear++;
                        queue[rear]=queue[front]->;rchild;
                }
        }
        return OK;
}
Status LevelOrderSwap(BiTree T)
/*用层次遍历来实施交换!*/
{
        BiTree swapT, queue[MaxNode];
        int front,rear;
        if(T==NULL)
                return FALSE;
        front=-1;
        rear=0;
        queue[rear]=T;
        while(front!=rear)
        {
                front++;
                if(queue[front]->;lchild!=NULL)
                {
                        rear++;
                        queue[rear]=queue[front]->;lchild;
                }
                if(queue[front]->;rchild!=NULL)
                {
                        rear++;
                        queue[rear]=queue[front]->;rchild;
                }
                swapT=queue[front]->;lchild;
                queue[front]->;lchild=queue[front]->;rchild;
                queue[front]->;rchild=swapT;
        }
        return OK;
}

Status InitStack(SqStack *S)
{
        S->;base=(BiTree)malloc(Stack_INIT_S*sizeof(BiTNode));
        if(!S->;base)
        {
                printf("Overflow! in InintStack()!";
                exit(OVERFLOW);
        }
        S->;top=S->;base;
        S->;stacksize=Stack_INIT_S;
        return OK;
}
Status Push(SqStack *S,BiTree T)
{
        if(S->;top-S->;base >;S->;stacksize)
        {
                puts("Error for Stack Full in Push()!";
                exit(OVERFLOW);
        }
        *(S->;top)=*T;
        S->;top++;
        return OK;
}

Status Pop(SqStack *S,BiTree T)
{
        if(S->;top==S->;base)
        {
                puts("Error for Stack Emputy in Pop() !";
                exit(FALSE);
        }
        --S->;top;
        *T=*(S->;top);
        return OK;
}
Status GetTop(SqStack *S,BiTree *e)
{
        if(S->;top==S->;base)
                return ERROR;
        *e=S->;top-1;
        return  OK;
}

Status StackEmpty(SqStack S)
{
        if(S.base==S.top)
                return TRUE;
        else
                return FALSE;
}
Status StackFull(SqStack S)
{
        if(S.base+S.stacksize==S.top-1)
                return TRUE;
        else
                return FALSE;
}

Status PrintElement(TElemType e)
{
        printf("%3c",e);
        return OK;
}

/*按先序次序输入,递归调用实现生成二树!*/
Status CreateBiTree(BiTree *T)
{
        char ch;
        ch=fgetc(fp);
        if(ch=='*')
                *T=NULL;
        else
        {
                if(!(*T=(BiTNode*)malloc(sizeof(BiTNode))))
                {
                        puts("OverFlow!! in CreateBiTree()");
                        exit(OVERFLOW);
                }
                (*T)->;data=ch;
                CreateBiTree(&(*T)->;lchild);
                CreateBiTree(&(*T)->;rchild);
        }
        return OK;
}

/*用不递归方法但借助栈来实现中序遍历*/
Status InOrderTraverse_1(BiTree T)
{
        BiTree p=NULL;
        SqStack S;
        Visit=PrintElement;
        InitStack(&S);
        Push(&S,T);
        while(!StackEmpty(S))
        {
                while(GetTop(&S,&p)&& p)
                        Push(&S,p->;lchild);
                Pop(&S,p);
                if(!StackEmpty(S))
                {
                        Pop(&S,p);
                        if(!Visit(p->;data))
                                return ERROR;
                        Push(&S,p->;rchild);
                }
        }
        return OK;
}
/*此算法是另一种方法实现中序遍历*/
Status InOrderTraverse_2(BiTree T)
{
        BiTree p;
        SqStack *S=NULL;
        Visit=PrintElement;
        InitStack(S);
        p=T;
        while(p||!StackEmpty(*S))
        {
                if(p)
                {
                        Push(S,p);
                        p=p->;lchild;
                }
                else
                {
                        Pop(S,p);
                        Visit(p->;data);
                        p=p->;rchild;
                }
        }
        return OK;
}





您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP