二叉排序树的基本操作(完整代码)
2015-11-03 15:38
351 查看
以下是二叉排序树的基本操作,函数基本与《大话数据结构》里的代码类似,包括查找、插入、删除操作。完整代码,可直接运行。
以上是最基本的代码,是看《大话数据结构》时根据书上代码编写的,适合最最基础的人看,有问题可以评论,同是菜鸟,我们一起讨论嘛~
[code]//二叉排序树 //其中有插入、删除、查找操作 #include<stdio.h> #include<stdlib.h> #define FALSE 0 #define TURE 1 #define MAXSIZE 10 typedef struct BiTNode { int data; struct BiTNode *lchild, *rchild; }BiTNode, *BiTree; //查找 //f指向T的双亲,初始时为NULL //这里用f,*p,是问了存储查找时遍历的最后一个元素,在插入时用 int SearchBST(BiTree T,int key,BiTree f,BiTree *p) { if(!T) { *p=f; return FALSE; } else if(key==T->data) { *p=T; return TURE; } else if(key<T->data) return SearchBST(T->lchild,key,T,p); else return SearchBST(T->rchild,key,T,p); } //插入 //如果插不到元素,获取查找时遍历的最后一个元素 //与其比较,大则是其右子树,反之、、 void 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; //设置新元素s if(!p) //若树为空,将s设为根节点 *T=s; else if(key<p->data) //否则。。 p->lchild=s; else p->rchild=s; } else printf("抱歉,树中已有该元素。 \n"); } //DeleteBST用到的子函数 //删除节点无左子树,则将其右子树补到现在位置,反之亦然 //若左右字树都有,则找其左子树,然后右到底,即中序遍历时,删除节点的上一个元素——前驱 //以前驱作为新节点 void 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; else q->lchild=s->lchild; free(s); } } //删除 void DeleteBST(BiTree *T,int key) { BiTree p; if(SearchBST(*T,key,NULL,&p)) //找与key相等的元素 { if(key==(*T)->data) Delete(T); else if(key<(*T)->data) DeleteBST(&(*T)->lchild,key); else DeleteBST(&(*T)->rchild,key); } else printf("抱歉,当前二叉树中没有你要删除的元素。 \n"); } //中序输出 void InOrder(BiTree T) { if(T) { InOrder(T->lchild); printf("%d ",T->data); InOrder(T->rchild); } else return; } void main() { int i,num; BiTree T=NULL; int a[10]={66,88,58,47,35,73,51,99,37,93}; for(i=0;i<10;i++) { InsertBST(&T,a[i]); } printf("当前的二叉树为:"); InOrder(T); printf("\n"); printf("请输入你要插入的元素:"); scanf("%d",&num); InsertBST(&T,num); printf("当前的二叉树为:"); InOrder(T); printf("\n"); printf("请输入你要删除的元素:"); scanf("%d",&num); DeleteBST(&T,num); printf("当前的二叉树为:"); InOrder(T); printf("\n"); }
以上是最基本的代码,是看《大话数据结构》时根据书上代码编写的,适合最最基础的人看,有问题可以评论,同是菜鸟,我们一起讨论嘛~
相关文章推荐
- php实现分页显示
- C# DataTable去除某列重复的数据
- C# Post数据和接收简单示例
- 创建 Win32 应用程序 (C++)
- Java的入门知识和准备步骤
- php empty,isset,is_null比较(差异与异同)
- PHP中的浅复制与深复制
- java list 根据对象的一个属性排序
- java socket 数据长度 最大
- JAVA MAIL发送邮件实例
- Python中使用MySQL
- Eclipse maven android开发指南
- Windows下Python自动补全
- 设置QTabWidget中tab页的大小
- C++primer第五版第一章学习笔记
- 学习Web应用漏洞最好的教程----WebGoat
- C#图片处理像素质量等代码问题
- PHP生成简单计算的验证码,模仿CSDN
- 使用const引用传递来提高效率
- python第二章-2.7 更多关于方法定义