二叉排序树创建、查找、删除
来源:互联网 发布:sql数据库存储过程 编辑:程序博客网 时间:2024/06/05 18:04
一、二叉树的结构体结构
typedef struct tree{ int date; tree *lchild; tree *rchild;}tr_t;
二、二叉排序树的创建
void creat_BStree(tr_t ** tr,int num){ if ((*tr) == NULL) { (*tr) = (tree*)malloc(sizeof(tree)); (*tr)->date = num; (*tr)->lchild = NULL; (*tr)->rchild = NULL; } else if(num < (*tr)->date) creat_BStree(&((*tr)->lchild), num); else if(num >(*tr)->date) creat_BStree(&((*tr)->rchild), num);}
三、二叉排序数的查找
tr_t * search_BStree(tr_t *tr,int date){ if (tr != NULL) { if (tr->date == date) { return tr; } else if (tr->date > date) { return search_BStree(tr->lchild, date); } else if(tr->date<date) { return search_BStree(tr->rchild, date); } } else { tr_t *t = (tr_t*)malloc(sizeof(tr_t)); t->lchild = NULL; t->rchild = NULL; t->date = 0; return t; }}
四、二叉排序树的删除
tr_t * delete_tr(tr_t *tr,int date){ if (tr != NULL) { //找到该节点 tr_t *p; tr_t *f; f = NULL; p = tr; while(p) { if (p->date == date) { break; } f = p; if (p->date < date) p = p->rchild; else p = p->lchild; } if (p == NULL) { return tr; } //如果将要删除的点 没有左孩子 if (p->lchild == NULL) { if (f == NULL)//如果删除的是根节点 tr = p->rchild; if (f->lchild == p) { f->lchild = p->rchild; } else if (f->rchild == p) { f->rchild = p->rchild; } free(p); } else//如果有左孩子 { //找到前驱 tr_t *q; tr_t *s; p = s = NULL; q = p; s = p->lchild; while (s) { q = s; s = s->rchild; } if (p==q) { p->lchild = s->lchild; } else { q->rchild = s->lchild; } p->date = s->date; free(s); } return tr; }}
五、源代码
#include<stdio.h>#include<stdlib.h>#define MAX 20#if 1//二叉排序树的创建、查找、删除typedef struct tree{ int date; tree *lchild; tree *rchild;}tr_t;void creat_BStree(tr_t ** tr,int num){ if ((*tr) == NULL) { (*tr) = (tree*)malloc(sizeof(tree)); (*tr)->date = num; (*tr)->lchild = NULL; (*tr)->rchild = NULL; } else if(num < (*tr)->date) creat_BStree(&((*tr)->lchild), num); else if(num >(*tr)->date) creat_BStree(&((*tr)->rchild), num);}//中序遍历输出void print(tr_t *tr){ if (tr != NULL) { print(tr->lchild); printf("%d ",tr->date); print(tr->rchild); }}//查找tr_t * search_BStree(tr_t *tr,int date){ if (tr != NULL) { if (tr->date == date) { return tr; } else if (tr->date > date) { return search_BStree(tr->lchild, date); } else if(tr->date<date) { return search_BStree(tr->rchild, date); } } else { tr_t *t = (tr_t*)malloc(sizeof(tr_t)); t->lchild = NULL; t->rchild = NULL; t->date = 0; return t; }}//删除一个结点tr_t * delete_tr(tr_t *tr,int date){ if (tr != NULL) { //找到该节点 tr_t *p; tr_t *f; f = NULL; p = tr; while(p) { if (p->date == date) { break; } f = p; if (p->date < date) p = p->rchild; else p = p->lchild; } if (p == NULL) { return tr; } //如果将要删除的点 没有左孩子 if (p->lchild == NULL) { if (f == NULL)//如果删除的是根节点 tr = p->rchild; if (f->lchild == p) { f->lchild = p->rchild; } else if (f->rchild == p) { f->rchild = p->rchild; } free(p); } else//如果有左孩子 { //找到前驱 tr_t *q; tr_t *s; p = s = NULL; q = p; s = p->lchild; while (s) { q = s; s = s->rchild; } if (p==q) { p->lchild = s->lchild; } else { q->rchild = s->lchild; } p->date = s->date; free(s); } return tr; }}int main(void){ tr_t *tr; tr = NULL; int num = 0; scanf("%d", &num); while (num != -1) { creat_BStree(&tr, num); scanf("%d", &num); } print(tr); printf("\n"); tr_t *p = search_BStree(tr ,30); printf("%d\n",p->date); delete_tr(tr,20); print(tr); printf("\n"); return 0;}#endif
阅读全文
0 0
- 二叉排序树创建、查找、删除
- 二叉排序树(创建,查找,删除)
- 二叉排序树的创建查找与删除
- 二叉排序树的创建,查找与删除
- 二叉排序树的创建,查找,插入,删除
- 数据结构 二叉排序树的创建,查找,插入,删除
- 数据结构 二叉排序树的创建、查找、删除
- 七、二叉排序树--(2)二叉排序树的创建/插入/查找/删除
- 树形结构的查找(二叉排序树-创建、查找、插入、删除)
- 二叉排序树查找、插入、删除
- 二叉排序树的查找删除
- 二叉查找树(二叉排序树)创建,插入,删除操作。
- 算法--查找--二叉排序树创建、查找
- 二叉排序树的查找、删除、插入
- 二叉排序树的删除和查找
- 二叉排序树(插入、删除、查找)
- 二叉排序树_插入+删除+查找
- 二叉排序树的插入,查找,删除
- Java的21个技术点,你知道吗?
- JAVA代理模式之三动态代理CGLIB详解
- Qt 中SQL语句通配符
- solr suggest
- 将model转化为字典
- 二叉排序树创建、查找、删除
- ZSH使用
- Java中关于“unreachble code”的报错
- 事务和锁(共享锁,排他锁,乐观,悲观,死锁)
- What is batch_size?
- linux下载ncurses库去使用make menuconfig
- 前台HTML页面显示XML内容
- WIFI和蓝牙无线模块的应用小结
- HTML课堂讲义(7)