C语言实现二叉排序树的相关操作
来源:互联网 发布:淘宝店铺装修布局管理 编辑:程序博客网 时间:2024/05/16 06:05
二叉排序树(Binary Sort Tree),又称为二叉查找树。它或者是一颗空树,或者是具有下列性质的二叉树:
- 若它的左子树不为空,则左子树上的所有结点的值均小于它的根结点的值
- 若它的右子树不为空,则右子树上的所有结点的值均大于它的根结点的值
- 它的左右子树也分别为二叉排序树
构造二叉排序树的目的,并不是为了排序,而是为了提高查找和插入删除关键字的速度。
以下程序在DEV C++中调试运行通过。
#include<stdio.h>#include<stdlib.h>/*二叉树的二叉链表结点结构定义*/typedef struct BiTNode{int data;struct BiTNode *lchild,*rchild;}BiTNode,*BiTree;/*递归查找二叉排序树T中是否存在key,指针f指向T的双亲,其初始调用值为NULL,若查找成功,则指针P指向该数据元素结点,并返回1,否则指针p指向查找路径上访问的最后一个节点并返回0*/int SearchBST(BiTree T,int key,BiTree f,BiTree *p){if(!T)//查找不成功{*p=f;return 0; } else if(key==T->data)//查找成功 {*p=T;return 1;}else if(key<T->data)return SearchBST(T->lchild,key,T,p);//在左子树继续查找 elsereturn SearchBST(T->rchild,key,T,p);//在右子树继续查找 }/*当二叉排序树T中不存在关键字等于key的数据元素时,插入key并返回1,否则返回0*/int InsertBST(BiTree *T,int key){BiTree p,s;if(!SearchBST(*T,key,NULL,&p))//查找不成功{s=(BiTree)malloc(sizeof(BiTNode));s->data=key;s->lchild=s->rchild=NULL;if(!p)*T=s;//插入s为新的根结点else if(key<p->data)p->lchild=s;//插入s为左孩子elsep->rchild=s;//插入s为右孩子return 1; } elsereturn 0; } /*若二叉排序树T中存在关键字key的数据元素时,则删除该数据元素节点,并返回1;否则返回0*/ int DeleteBST(BiTree *T,int key){if(!T)return 0;else{if(key==(*T)->data)return Delete(T);else if(key<(*T)->data)return DeleteBST(&(*T)->lchild,key);elsereturn DeleteBST(&(*T)->rchild,key);}}int Delete(BiTree *p){BiTree q,s;if((*p)->rchild==NULL)//右子树为空只需重接它的左子树{q=*p;*p=(*p)->lchild;free(q);} else if((*p)->lchild==NULL){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;elseq->lchild=s->lchild;free(s);} return 1;}int main(){int i,j;int a[10]={62,88,58,47,35,73,51,99,37,93};BiTree T=NULL,p;//二叉排序树的插入和创建 for(i=0;i<10;i++){InsertBST(&T,a[i]);}j=SearchBST(T,51,NULL,&p);if(j=1)printf("搜索51成功!");j=DeleteBST(&T,47);if(j=1)printf("删除47成功!");}运行结果如图所示。
二叉排序树的查找性能取决于二叉排序树的形状,二它的形状是不确定的。极端右斜树的查找时间复杂度为O(n),等同于顺序查找;而平衡二叉树的查找时间复杂度为O(logn),等同于折半查找。
阅读全文
1 0
- C语言实现二叉排序树的相关操作
- 二叉排序树的建立以及相关操作 C语言
- c语言:二叉排序树的实现
- C语言二叉排序树的实现
- C语言实现二叉排序树的增删查操作
- 二叉排序树的操作(C语言)
- 二叉排序树 C语言实现
- C语言实现二叉排序树
- 二叉排序树的相关操作
- java语言实现二叉排序树的操作
- 创建二叉排序树C语言实现
- 二叉排序树C语言实现一
- 二叉排序树C语言实现二
- c语言实现链表的相关的操作
- C语言实现链表的相关操作
- 双向链表的相关操作--C语言实现
- 单链表顺序存储相关操作的c语言实现
- C语言:静态顺序表的实现和相关操作
- 为centos7配置网络桥接
- javaEE注解@Decorator/@Delegate/@Observes/@Produces/@Alternative
- Android 电话管理器TelephonyManager,获取网络,SIM卡信息
- Android获取外置SD卡路径
- vim的使用教程
- C语言实现二叉排序树的相关操作
- 矩阵 A+B【水题】
- ESP8266 SDK开发篇(四)——UDP通信
- PSPNet(Pyramid Scene Parsing Network)
- 使用共享内存实现一个进程写文件,两个进程读文件
- mybatis诡异的异常!!!时好时坏!!!
- Jenkins显示reportng测试报告
- Servlet---ServletRequest和ServletResponse(1)
- 批量修改名字