您的位置:首页 > 理论基础 > 数据结构算法

关于查询的部分数据结构实现-C语言

2013-04-05 22:29 393 查看
一, Sequence Search

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)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: