首页 > 用户发贴区 > 编程问题提问区 > 二叉排序树问题
2008
09-10

下面是我的程序 运行环境是vc6.0,我老是在随机建立二叉排序树时出现问题,删除节点有时成功有时不成功,拜托各位帮帮忙,谢谢了! 请帮我把出错的模块改过来,告诉我为什么我会出错,谢谢啦!


 


 


 


#include <stdio.h>


#include <stdlib.h>


# define queuemaxsize 20


# define stackmaxsize 10


 


typedef int elemtype;


struct btreenode


       {


        elemtype data;


        struct btreenode *left;


        struct btreenode *right;


       };


 


void Insert1(struct btreenode* *bst,elemtype x)


 /*插入元素递归算法,向二叉树插入一元素*/


{


       if(*bst==NULL)/*在为空指针位置连接新节点*/


    {


        struct btreenode *p=malloc(sizeof(struct btreenode));


        /*P节点分配地址,Pbtreenode结构体类型*/


     p->data=x;


     p->left=p->right=NULL;


     *bst=p;/*P为根节点*/


    }


 


 if(x<(*bst)->data)


    Insert1(&((*bst)->left),x);


    /*递归算法向左子树插入元素*/


 


 if(x>(*bst)->data)


    Insert1(&((*bst)->right),x);


    /*递归算法向子树插入元素*/


 


}


 


void Insert(struct btreenode* *bst,elemtype x)


/*插入元素非递归算法*/


{


       struct btreenode *p;


       /*定义变量*Pbtreenode结构体类型*/


       struct btreenode *t=*bst,*parent=NULL;


       /*定义变量*t,*parentbtreenode结构体类型*/


       while(t!=NULL)


       {


              parent=t;


              if(x<t->data)


                     t=t->left;


              else


                     t=t->right;


       }


       p=malloc(sizeof(struct btreenode));//分配空间给P


       p->data=x;


       p->left=p->right=NULL;


       if(parent==NULL)


              *bst=p;


       else if (x<parent->data)


              parent->left=p;


       else parent->right=p;


}


 


void creatbstree1(struct btreenode **bst)


//随机输入数据建立二叉排序树


{


       elemtype data;bst=NULL;


       scanf(“%d”,&data);


       while(data!=00)//00作为结束


       {


              Insert1(&bst,data);


              scanf(“%d”,&data);


       }


 


}


 


void creatbstree(struct btreenode* *bst,elemtype a[],int n)


/*利用数组n个元素建立二叉树*/


{


       int i;


       *bst=NULL;


    for(i=0;i<n;i++)


       Insert1(bst,a[i]);


}


 


int Delete (struct btreenode* *bst,elemtype x)


/*bst指针所指向的二叉树中删除节点x的递归算法*/


{


       struct btreenode *temp;


       //定义*tempbtreenode结构体类型的地址


    temp=*bst;//temp的内容是*bst(也是内容)


       if(*bst==NULL)


              return 0;


       if(x<(*bst)->data) 


              return Delete(&((*bst)->left),x);


           /*删除左子树节点x的递归算法*/


       if(x>(*bst)->data)  


              return Delete(&((*bst)->left),x);


           /*删除右子树节点x的递归算法*/


       if((*bst)->left==NULL)


              //待删除元素为根节点且它的左子树是空


              {


              *bst=(*bst)->right; //将右子树作为整个子树并返回1


              free(temp);


              return 1;


              }


       else if((*bst)->right==NULL)


              //待删除元素为根节点且它的右子树是空


              {


              *bst=(*bst)->left;//将左子树作为整个子树并返回1


              free(temp);


              return 1;


              }


       else


              if((*bst)->left->right==NULL)//左右子树都不为空


              {


                     (*bst)->data=(*bst)->left->data;


                     return Delete(&((*bst)->left),(*bst)->data);


              }


    else


              if((*bst)->right->left==NULL)


              {


                     struct btreenode *p1=*bst,*p2=p1->left;


                      while(p2->right!=NULL)


                     {


                            p1=p2;


                            p2=p2->right;


                            (*bst)->data=p2->data;


                            return Delete((&p1->right),p2->data);


                     } 


              }


}


 


void Inorder(struct btreenode *bst)


/*中序遍历递归算法*/


{


       if(bst!=NULL)


       {


              Inorder(bst->left);


              printf(“%d “,bst->data);


              Inorder(bst->right);


       }


 


}


 


 


elemtype* find(struct btreenode *bst,elemtype x)


//从二叉树中找等于给定值x的元素递归算法*/


{


       if(bst==NULL) 


              return NULL;


       else


       {


              if(x==bst->data)


                     return &(bst->data);


              else if(x>bst->data)


                     return find(bst->right,x);


        else if(x<bst->data) 


                     return find(bst->left,x);


       }


 


}


 


elemtype* find1(struct btreenode *bst,elemtype x)


/*查找元素的非递归算法*/


{


       while(bst!=NULL)


       {


              if(x==bst->data)


                     return &(bst->data);


              else if(x<bst->data)


                     bst=bst->left;


              else bst=bst->right;


       }


       return NULL;


}


 


void printbtree(struct btreenode* btree)


/*广义表形式输出二叉树,其实是在中序遍历的递归算法上修改来的*/


{


       if(btree!=NULL)


       {


              printf(“%d”,btree->data);


              if(btree->left!=NULL||btree->right!=NULL)


              {


                     printf(“(“);


                     printbtree(btree->left);


                     if(btree->right!=NULL)


                            printf(“,”);


                     printbtree(btree->right);


                     printf(“)”);


              }


       }


}


 


void main()


{


       int p,m,x,*px;


       int i,n;


       int a[200];


    struct btreenode *bst=NULL;


loop:   


{ 


    printf(“————————————————————-\n”);


       printf(“0.利用数组建立二叉排序树\n”);


       printf(“1.随机输入数据建立二叉排序树\n”);


       printf(“2.退出:\n”);


    printf(“————————————————————-\n”);


    printf(“请输入您的选择“);


       scanf(“%d”,&p);


switch(p)


       {


    case 0:


       printf(“请输入数组元素个数“);


         scanf(“%d”,&n);


       printf(“请输入数组元素值\n”);


       for(i=0;i<n;i++)


              scanf(“%d”,&a[i]);


       creatbstree(&bst,a,n);


       printf(“相应操作后的中序遍历为\n”);


       Inorder(bst);


       printf(“\n”);


 


       printf(“相应操作后的二叉树广义表形式为\n”);


       printbtree(bst);


       printf(“\n”);


       break;


       case 1:printf(“请输入元素(以00作为束)\n”);


       creatbstree1(&bst);


       printf(“相应操作后的中序遍历为\n”);


       Inorder(bst);


       printf(“\n”);


 


       printf(“相应操作后的二叉树广义表形式为\n”);


       printbtree(bst);


       printf(“\n”);


       break;


    case 2:exit(0);


      


       default: printf(“选择输入有误,请重新选择\n”);


    printf(“————————————————————-\n”);


    goto loop;


       }


}


 


   


while(1)


{   printf(“————————————————————-\n”);


       printf(“1.输入查找元素值\n”);


       printf(“2.输入待插入元素的值:\n”);


       printf(“3.输入待删除元素的值:\n”);


       printf(“5.重新建立二叉树:\n”);


       printf(“4.退出:\n”);


    printf(“————————————————————-\n”);


    printf(“请输入您的选择“);


       scanf(“%d”,&m);


       switch(m)


       {


       case 1:


       printf(“输入查找元素值\n”);


       scanf(“%d”,&x);


       if(px=find(bst,x))


       printf(“查找成功:%d\n”,*px);


       else


       printf(“查找失败\n”);


       break;


 


    case 2:


       printf(“输入待插入元素的值:”);


       scanf(“%d”,&x);


       Insert1(&bst,x);


 


       printf(“相应操作后的中序遍历为\n”);


       Inorder(bst);


       printf(“\n”);


 


       printf(“相应操作后的二叉树广义表形式为\n”);


       printbtree(bst);


       printf(“\n”);


       break;


 


    case 3:


       printf(“输入删除元素:”);


       scanf(“%d”,&x);


       if(x=Delete(&bst,x))


    printf(“删除成功\n”);


       else  


    printf(“删除失败\n”);


 


       printf(“相应操作后的中序遍历为\n”);


       Inorder(bst);


       printf(“\n”);


 


       printf(“相应操作后的二叉树广义表形式为\n”);


       printbtree(bst);


       printf(“\n”);


       break;


 


       case 4:exit(0);


 


       case 5:goto loop;


      


       default: printf(“选择输入有误,请重新选择\n”);


    }


 


  }


 


}


二叉排序树问题》有 3 条评论

  1. xcgang 说:

    void creatbstree1(struct btreenode **bst)

    //随机输入数据建立二叉排序树

    {

       elemtype data;bst=NULL;

       scanf(“%d”,&data);

       while(data!=00)//以00作为结束

       {

          Insert1(&bst,data);

          scanf(“%d”,&data);

       }

    }

    这个里面有2个错误

    1. bst=NULL ,应该是 *bst=NULL

    2. Insert1(&bst,data); 应该是  Insert1(bst,data); // 这句在vc里面编译也

    通不过 。

  2. yinbinglengyue 说:

    [QUOTE=xcgang]void creatbstree1(struct btreenode **bst)
    //随机输入数据建立二叉排序树
    {
       elemtype data;bst=NULL;
       scanf(“%d”,&data);
       while(data!=00)//以00作为结束
       {
          Insert1(&bst,data);
          scanf(“%d”,&data);
       }

    }
    这个里面有2个错误
    1. bst=NULL ,应该是 *bst=NULL
    2. Insert1(&bst,data); 应该是  Insert1(bst,data); // 这句在vc里面编译也
    通不过 。[/QUOTE]

    谢谢你啊!

  3. IFandFOR 说:

    楼上的 应该是 *bst==NULL 吧?个人愚见.

留下一个回复