数据结构_8:查找:二叉排序树
2016-01-21 14:32
501 查看
二叉排序树
数据结构typedef struct BiTNode //结点结构 { int data; //结点数据 struct BiTNode *lchild,*rchild; // 左右孩子指针 }BiTNode,*BiTree;
二叉排序树
//f 指向双亲 //若查找成功,则指针p指向数据元素结点, //否则指针p指向查找路径上访问的最后一个节点 Status SearchBST(BiTree T,int key, BiTree f,BiTree *p) { if(!T) //查找不成功 { *p=f; return FALSE; } else if(key==T->data) //查找成功 { *p=T; return TRUE; } else if(ky<T->data) return SearchBST(T->lchild,key,T,p); //左子树继续寻找 else return SearchBST(T->rchild,key,T,p); //右子树继续寻找 }
二叉排序树的插入操作
Status 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为左孩子 else p->rchild=s; //插入s为右孩子 return TRUE; } else return FALSE; }
二叉排序树的删除
//1.叶子结点 //2.仅有左子树或者右子树 //3.左右子树都有结点:删除 Status DeleteBST(BiTree *T,int key) { if(*T) return FALSE; else { if(key==(*T)->data) return Delete(T); else if(key<(*T)->data) return DeleteBST(&(*T)->lchild,key); else return DeleteBST(&(*T)->rchild,key); } }
删除结点
Status 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; //s指向被删除点的前驱 if(q!=*p) q->rchild=s->lchild; //重接q的右子树 else q->lchild=s->lchild; //重接q的左子树 free(s); } return TRUE; }
相关文章推荐
- 再谈单链表
- MySQL索引背后的数据结构及算法原理
- 数据结构算法经典合集
- 算法与数据结构
- 数据结构(3)归并排序
- pyhton 数据结构二
- 数据结构 线性表―单链表
- Java核心技术笔记——数据结构(2)
- 数据结构和算法学习第3天:队列的相关知识
- 二叉树学习(一)
- 数据结构和算法学习第2天:栈的相关知识
- 菜鸟nginx源代码剖析数据结构篇(一)动态数组ngx_array_t
- 数据结构实现之队列
- 数据结构实现之栈
- 集合和数组的排序算法
- 算法与数据结构学习资源大搜罗——良心推荐
- 数据结构之递归算法
- 数据结构和算法学习第1天:线性表
- 【Redis笔记(三)】 Redis数据结构 - hash哈希
- 算法与数据结构学习资料及面试