| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 529 人关注过本帖
标题:关于二叉排序树实现的程序,里面有些错误我找不出来,请各位帮帮忙
只看楼主 加入收藏
baijingzuo
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2011-7-2
结帖率:50%
收藏
已结贴  问题点数:20 回复次数:3 
关于二叉排序树实现的程序,里面有些错误我找不出来,请各位帮帮忙
各位帮帮忙啊 ,我不明白这个 是怎么错了,画线部分有问题啊,谢谢了
下划线的地方有错误,我看不明白,不知道怎么改,我是学生,谢谢各位指教

#include"stdio.h"[
#include"stdlib.h"
#define KeyType int
#define EQ(a,b) ((a)==(b))
#define LT(a,b) ((a)< (b))
#define LQ(a,b) ((a)<=(b))
#define FALSE 0
#define ERROR 0
#define OK    1
#define TRUE  1
   //二叉树的二叉链表存储表示以及先序遍历、中序遍历和后序遍历所运用到的栈的顺序存储表示。
typedef struct  
{
KeyType key;                                                //关键字域
} ElemType;                                                                                   
typedef struct BiTNode               //定义二叉树二叉链表
{
    ElemType  data;
    struct BiTNode *lchild, *rchild;
}BiTNode,*BiTree,*SElemType;
typedef struct
{
    SElemType *base;
    SElemType *top;
    int stacksize;
}SqStack;

    //源程序中包括了销毁树、清空树、关键字查找、节点插入生成二叉排序树、删除节点、树形显示、以及先序遍历、中序遍历、后序遍历等等基本操作函数原型说明
int DestroyBiTree(BiTree &T) //销毁树
{
    if(T!=NULL)
    free(T);
    return 0;
}

int ClearBiTree(BiTree &T) //清空树
{
    if(T!=NULL)
    {
        T->lchild=NULL;
        T->rchild=NULL;
        T=NULL;
    }
    return 0;
}

int SearchBST(BiTree T,KeyType key,BiTree f,BiTree &p)    //查找关键字,指针p返回
{
    if(!T)
    {
        p=f;
        return FALSE;
    }
    else if EQ(key,T->data.key)
    {
        p=T;
        return TRUE;
    }
    else if LT(key,T->data.key)
        return SearchBST(T->lchild,key,T,p);
    else
        return SearchBST(T->rchild,key,T,p);
}

int InsertBST(BiTree &T,ElemType e)   //插入节点元素
{
    BiTree s,p;
    if(!SearchBST(T,e.key,NULL,p))
    {
        s=(BiTree)malloc(sizeof(BiTNode));
        s->data=e;
        s->lchild=s->rchild=NULL;
        if(!p)
            T=s;
        else if LT(e.key,p->data.key)
            p->lchild=s;
        else
            p->rchild=s;
        return TRUE;
    }
    else return FALSE;
}

int ShowBST(BiTree T,int nlayer)      //显示树形二叉排序树
{
    int i;
    if(T==NULL)  
        return FALSE;
    ShowBST(T->rchild,nlayer+1);
    for(i=0;i<nlayer;i++)
        printf("    ");
    printf("%d\n",T->data);
    ShowBST(T->lchild,nlayer+1);
    return OK;
}

int Visit(ElemType e)  //Visit函数
{
    printf("%d ",e.key);
    return OK;
}

int InitStack(SqStack &S)   //构造空栈
{
    S.base=(SElemType*)malloc(STACK_INIT_SIZE *sizeof(SElemType));
    if(!S.base) exit(OVERFLOW);
    S.top=S.base;
    S.stacksize=STACK_INIT_SIZE;
    return OK;
}//InitStack

int Push(SqStack &S, SElemType e)  //插入元素e为新栈顶
{
    if(S.top-S.base>=S.stacksize)
    {
       S.base=(SElemType*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(SElemType));
        if(!S.base) exit(OVERFLOW);
        S.top=S.base+S.stacksize;
        S.stacksize+=STACKINCREMENT;
    }
    *S.top++=e;
    return OK;
}//Push

int Pop(SqStack &S,SElemType &e)  //删除栈顶,应用e返回其值
{
    if(S.top==S.base)
     return ERROR;
    e=*--S.top;
    return OK;
}//Pop

int StackEmpty(SqStack S)          //判断是否为空栈
{
    if(S.base==S.top) return TRUE;
    return FALSE;
}

int PreOrderTraverse(BiTree T,int(*Visit)(ElemType e))  //先序遍历,运用栈
{
    SqStack S;
    BiTree p;
    InitStack(S);
    p=T;
    while(p|| !StackEmpty(S))
    {
        if(p)
        {
            Push(S,p);
            if(!Visit(p->data))
             return ERROR;   
            p=p->lchild;
        }
        else
        {
            Pop(S, p);
            p=p->rchild;
        }
    }
    return OK;
}

int InOrderTraverse(BiTree T, int(*Visit)(ElemType e))  //中序遍历,运用栈
{
    SqStack S;
    BiTree p;
    InitStack(S);
    p=T;
    while(p|| !StackEmpty(S))
    {
        if(p)
        {
            Push(S,p);
            p=p->lchild;
        }
        else
        {
            Pop(S,p);
            
            if(!Visit(p->data))
             return ERROR;
            
            p=p->rchild;
        }
   
    }
    return OK;
}

int PostOrderTraverse(BiTree T,int(*Visit)(ElemType e)) //后序遍历,运用栈
{
    SqStack S,SS;
    BiTree p;
    InitStack(S);
    InitStack(SS);
    p=T;
    while(p|| !StackEmpty(S))
    {
        if(p)
        {
            Push(S,p);
            Push(SS,p);
            p=p->rchild;
        }
        else
        {
            if(!StackEmpty(S))
            {
                Pop(S, p);
                p=p->lchild;
            }
        }
    }
    while(!StackEmpty(SS))
    {
        Pop(SS, p);
        if(!Visit(p->data)) return ERROR;     
    }
    return OK;
}

int Delete(BiTree &p) // 三种删除节点的操作实现
{
    BiTree q,s;
    if(!p->rchild)    //右子树为空
    {
        q=p;
        p=p->lchild;
        free(q);
    }
    else if(!p->lchild)    //左子树为空
    {
        q=p;
        p=p->rchild;
        free(q);
    }
    else
    {
        q=p;
        s=p->lchild;
        while(s->rchild)
        {
            q=s;
            s=s->rchild;
        }
        p->data=s->data;
        if(q!=p)
            q->rchild=s->lchild;
        else
            q->lchild=s->lchild;
        delete s;
    }
    return TRUE;
}

int DeleteBST(BiTree &T,KeyType key) //实现二叉排序树的删除操作
{
    if(!T)
        return FALSE;
    else
    {
        if (EQ(key,T->data.key))       //T->data.key等于key
            return Delete(T);
        else if (LT(key,T->data.key))   //T->data.key是否小于key
            return DeleteBST(T->lchild,key);
        else
            return DeleteBST(T->rchild,key);
    }
    return 0;
}
//源程序主函数为:
void main ()
{
    int i,nlayer;
    ElemType k,d;
    BiTree  BT,p;
    BT=NULL;
    p=NULL;
    nlayer=1;
    printf("请输入插入的二叉树节点的数值(输入数字0结束节点赋值):\n");
    scanf("%d",&k.key);
    for(i=0;k.key!=NULL;i++)
    {        
        if(!SearchBST(BT,k.key,NULL,p))         //查找关键字
        {
            InsertBST(BT,k);                    //二叉树节点数值插入
            scanf("%d",&k.key);
        }
        else
        {
            printf("输入数据重复!\n");
            return ;
        }
    }
    printf("二叉排序树树形输出为:\n");
    ShowBST(BT,nlayer);                        //树形显示二叉排序树
    printf("请输入删除的数据:");
    scanf("%d",&d.key);
    DeleteBST(BT,d.key);                       //删除关键字
    ShowBST(BT,nlayer);
    printf("先序遍历为:");                    //先序遍历、中序遍历、后序遍历
    PreOrderTraverse(BT,Visit);
    printf("\n中序遍历为:");
    InOrderTraverse(BT, Visit);
    printf("\n后序遍历为:");
    PostOrderTraverse(BT,Visit);
    printf("\n清空该二叉排序树.\n");            //清空二叉树
    ClearBiTree(BT);
    ShowBST(BT,nlayer);
    printf("\n销毁该二叉排序树.\n");            //销毁二叉树
    ClearBiTree(BT);
}

[ 本帖最后由 baijingzuo 于 2011-7-3 12:22 编辑 ]
搜索更多相关主题的帖子: include 二叉树 下划线 
2011-07-02 09:30
h_mastuade
Rank: 2
等 级:论坛游民
帖 子:21
专家分:86
注 册:2011-6-28
收藏
得分:10 
  楼主不把错误的地方标出来   别人怎么帮你看   程序这么长...
2011-07-02 12:29
bccn_2012
Rank: 6Rank: 6
等 级:侠之大者
帖 子:158
专家分:447
注 册:2011-5-14
收藏
得分:10 
你也得把错误的地方 标出来吧?
2011-07-02 17:55
baijingzuo
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2011-7-2
收藏
得分:0 
回复 3楼 bccn_2012
嗯,不好意思,我还是新手,我用下划线标出来了,请帮忙看看,谢谢了
2011-07-02 21:44
快速回复:关于二叉排序树实现的程序,里面有些错误我找不出来,请各位帮帮忙
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.013298 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved