关于查询的部分数据结构实现-C语言
2013-04-05 22:29
393 查看
一, Sequence Search
View Code
六. Binary Balance Tree. (AVL)
View Code
// Binary Sort Tree // yefeng1627 #include<stdio.h> #include<stdlib.h> #define False 0 #define True 1 //********** //重点说明: // 对于指针操作,若需要通过 // 作为参数,改变指针指向,则需使用二维指针 // 来改变其指向。 因为指针存储的是其指向的地址。 //********** typedef int DataType; typedef int KeyType; typedef struct BinTNode{ KeyType key; //关键字域 DataType other; //其它属性域 BinTNode *lchild, *rchild; }BinTNode, *BiTree; void print( BiTree T ){ // 中序遍历二叉排序树 T, 并输出关键域 if( T == NULL ) return; if( T->lchild != NULL ) print( T->lchild ); printf("%d ", T->key ); if( T->rchild != NULL ) print( T->rchild ); } //对于指针 C, F 而言,其需要改变传入进来指针的指向 int BSTSearch( BiTree T, BiTree *C, BiTree *F, KeyType x ){ //在二叉排序树T上查找关键码为x的元素,若找到返回True,且C指向该节点,F指向其父节点 //否则,返回false,且C指向查找失败的最后一个节点 *C = T; while( *C ){//从根节点开始查找 if( x > (*C)->key ){//x大于当前节点C的元素关键值 *F = *C; *C = (*C)->rchild; //将当前节点C的右子树的根节点置为新根 } else if( x < (*C)->key ){//x小于当前节点C的元素关键值 *F = *C; *C = (*C)->lchild; } else return True; }//end while return False; } int InsertNode( BiTree *T, KeyType x ){ //在二叉排序树T,上插入关键值为x的节点 // system("pause"); BinTNode *p = *T, *q = NULL, *s; if( BSTSearch( *T, &p, &q, x ) == False ){ //在*T为根的子树上查找 s = (BinTNode *)malloc( sizeof(BinTNode) ); //申请节点,并赋值 s->key = x; s->lchild = NULL; s->rchild = NULL; if( q == NULL ) *T = s; //向空树中插入时 else{ if( x > q->key ) q->rchild = s; //插入节点为p的右孩子 else q->lchild = s; //插入节点为p的左孩子 }//end if-else return True; }//end-if return False; } int CreateBST( BiTree *T, KeyType *a, int num ){ // 构造二叉排序树 T *T = NULL; for(int i = 0; i < num; i++){ InsertNode( T, a[i] ); } return True; } int DeleteNode( BiTree *T, KeyType x ){ BinTNode *c, *f, *child; if( BSTSearch( *T, &c, &f, x ) == True ){ //若找到待删除节点 (*c所指) if( c->lchild == NULL && c->rchild == NULL ){ //情况1:待删节点为叶子节点 if( f ){ //待删节点有父节点,则非根节点 if( f->lchild == c ) f->lchild = NULL; else f->rchild = NULL; } else//待删节点为根节点 *T = NULL; free( c ); //释放 c指针所指内存 } else if( c->lchild == NULL ){ //情况2: 待删节点的左子树为空,用待删除的右子树替代该节点 if( f ){ //待删节点双亲节点不为空 if( f->lchild == c ) // 待删节点为其父节点左儿子 f->lchild = c->rchild; else f->rchild = c->rchild; //待删节点为其父节点右儿子 } else *T = c->rchild; free( c ); } else if( c->rchild == NULL ){ //情况3: 待删节点的右子树为空,用待删除的左子树替代该节点 if( f ){ //待删节点双亲节点不为空 if( f->lchild == c ) //待删节点为其父节点左儿子 f->lchild = c->lchild; else f->rchild = c->lchild; } else *T = c->lchild; free( c ); } else{ //情况4:待删节点的左右子树均不为空 // 用右子树代替待删节点,同时将待删除 // 节点的左子树收为,右子树,中序首点的左儿子 child = c->rchild; while( child->lchild ) //找待删节点右子树中的 中序首点 child = child->lchild; // 将待删节点的左子树收为 child的左孩子 child->lchild = c->lchild; if( f ){ //待删除节点的右子树不为空 if( f->lchild == c ) // 用 f->lchild = c->rchild; else f->rchild = c->rchild; } else *T = c->rchild; free( c ); } return True; } return False; }//End of DeleteNode int main(){ // 数据定义 KeyType a[7] = {49,55,25,39,63,13,2}; BiTree T; BinTNode *c = NULL, *f = NULL; KeyType x; // 创建二叉排序数 CreateBST( &T, a, 7 ); //中序遍历输出二叉排序树节点信息 printf("构造成功,中序遍历为:\n"); print( T ); printf("\n"); // 查询 x = 39; if( BSTSearch( T, &c, &f, x ) == True ) printf("二叉排序树查找成功!\n"); else printf("查找失败!\n"); // 删除 //******************* // 删除操作四种情况测试 // Case 1: x = 39 , 左右子树皆为空 // Case 2: x = 55 , 左子树为空 // Case 3: x = 13 , 右子树为空 // Case 4: x = 25 , 左右子树均不为空 //******************* x = 25; //删除关键域为2的节点 printf("删除操作前,二叉排序树,中序遍历为:\n"); print( T ); puts(""); DeleteNode( &T, x ); printf("删除操作后,二叉排序树,中序遍历为:\n"); print( T ); puts(""); return 0; }
六. Binary Balance Tree. (AVL)
相关文章推荐
- 数据结构双向循环链表的C语言实现(插入,查询,删除)
- 关于数据结构的10个面试题(c语言实现)
- 关于数据结构的10个面试题(c语言实现)
- C语言实现Huffman Tree(参考严蔚敏《数据结构》部分伪码)
- 关于digit统计算法(C语言实现)
- 关于EF查询表里的部分字段
- 数据结构中的排序——C语言实现排序源代码
- 【C语言 数据结构】栈的极简实现
- dySE:一个 Java 搜索引擎的实现,第 3 部分: 查询服务
- 跪求一道关于c语言和数据结构的问题
- 【智能查询】:关于智能查找输入的算法实现1
- 数据结构 链表的实现(C语言)
- 数据结构C语言实现系列——二叉树
- 使用C语言的libcurl库和cJSON库来在线查询CVE漏洞代码实现
- 数据结构 C语言实现选择排序
- 关于字符串中函数的实现( C语言 )
- C语言数据结构-顺序队列-数组实现
- 数据结构(严蔚敏)之二——链表的c语言实现
- 数据结构:循环队列(C语言实现)
- 数据结构(二)——链表(C语言实现)