C语言二叉查找(排序树)的建立以及遍历

  1 #include"stdio.h"
  2 #include"malloc.h"
  3 typedef int elemtype;
  4 typedef struct btnode
  5 {
  6     elemtype data;/*关键字域*/
  7     struct btnode *lchild,*rchild;
  8 }btnode,*bitree;
  9 int searchBST(bitree t, elemtype key, bitree f,bitree *p)
 10 /*递归查找二叉排序树t是否存在key,指针f指向t的双亲,其初始调用值为NULL,若查找成功,
 11 则指针p指向该数据元素结点并返回1,否则指针p指向查找路径上访问的最后一个结点并返回0*/
 12 {
 13     if (!t){ *p=f; return 0;}//查找不成功
 14     else if(key==t->data)//查找成功
 15     {
 16         *p=t;
 17         return 1;
 18     }
 19     else if(key<t->data)
 20         return searchBST(t->lchild,key,t,p);//在左子树继续查找
 21     else
 22         return searchBST(t->rchild,key,t,p);//在右子树继续查找
 23 }
 24 
 25 int insertBST(bitree *t, elemtype key)
 26 /*当二叉排序树T中不存在关键字等于key的数据元素时,插入key返回二叉排序树的根结点。*/
 27 {   
 28     bitree p,s;
 29     if (!searchBST(*t,key,NULL,&p))                         /*查找不成功*/
 30     {
 31         s=(bitree)malloc(sizeof(btnode));
 32         s->data=key; 
 33         s->lchild = s->rchild = NULL;
 34         if (!p) *t=s;        /*插入s为新的根结点*/
 35         else  if ( key< p->data)
 36             p->lchild=s;     /*插入s为左孩子*/
 37         else 
 38             p->rchild=s;     /*插入s为右孩子*/
 39         return 1;
 40       }
 41     else
 42         return 0;
 43 }
 44 void inorder(bitree bt)   //中序遍历
 45 {
 46     if(bt==NULL)return;
 47     else{
 48         inorder(bt->lchild);
 49         printf("%d ",bt->data);
 50         inorder(bt->rchild);
 51     }
 52 }
 53 /*若二叉排序树存在关键字等于key的数据元素时,则删除该数据元素结点*/
 54 int deleteBST(bitree *t, elemtype key)
 55 {
 56     if(!*t)//不存在关键字等于key的数据元素
 57         return 0;
 58     else
 59     {
 60         if(key==(*t)->data)
 61             return delete(t);
 62         else if(key<(*t)->data)
 63             return deleteBST(&(*t)->lchild,key);
 64         else
 65             return deleteBST(&(*t)->rchild,key);
 66     }
 67 }
 68 int  delete(bitree *p)
 69 {
 70     bitree q,s;
 71     if((*p)->rchild==NULL)//右子树空则只需重接它的左子树
 72     {
 73         q=*p;*p=(*p)->lchild;free(q);
 74     }
 75     else if((*p)->lchild==NULL)//只需重接它的右子树
 76     {
 77         q=*p;*p=(*p)->rchild;free(q);
 78     }
 79     else//左右子树都不空
 80     {
 81         q=*p;s=(*p)->lchild;
 82         while(s->rchild){//转左,然后向右到尽头
 83             q=s;s=s->rchild;
 84         
 85         }
 86         (*p)->data=s->data;//s指向被删结点的直接前驱
 87         if(q!=*p)
 88             q->rchild=s->lchild;//重接q的右子树
 89         else
 90             q->lchild=s->lchild;//重接q的左子树
 91         free(s);
 92     }
 93     return 1;
 94 }
 95 int main()
 96 {
 97     int i;bitree f=NULL,p;
 98     int a[10]={62,88,58,47,35,73,51,99,37,93};
 99     bitree t=NULL;
100     for(i=0;i<10;i++)
101     {
102         insertBST(&t, a[i]);//插入
103     }
104     inorder(t);
105     printf("\n");
106     if(searchBST(t,88,f,&p)==1);
107         printf("查找成功,p已指向该元素!");
108     deleteBST(&t,37);//删除
109     printf("\n删除后:\n");
110     inorder(t);
111     printf("\n");
112     return 0;
113 }

转载于:https://www.cnblogs.com/1772642558sgzj/p/9354916.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值