数据结构_查找_动态查找表_二叉排序树
来源:互联网 发布:手机游戏录制软件 编辑:程序博客网 时间:2024/06/02 20:23
定义:
二叉排序树(Binary Sort Tree)又称二叉查找树。 它或者是一棵空树;或者是具有下列性质的二叉树:
(1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值;
(2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值;
(3)左、右子树也分别为二叉排序树;
下面代码中主要实现了二叉树的插入,删除,查找三个功能;具体的实现有注释,如果有错误或者您不理解的地方,欢迎提出来,大家共同讨论。#include<stdio.h>#include<malloc.h>#define EQ(a,b) ((a)==(b))#define LT(a,b) ((a)<(b))#define LQ(a,b) ((a)<=(b))typedef int KeyType ;typedef struct ElemType//树的存储内容,为了简便,只存储了关键值{KeyType key;//关键字}ElemType;typedef struct BSTNode//二叉排序树的结构{ElemType data;BSTNode *lchild,*rchild;}*BSTree;void InitBSTree(BSTree &T)//树的初始化{T=NULL;}int SearchBST(BSTree T,KeyType key,BSTree f,BSTree &p)//查找关键值为key的函数,若存在这个结点,则在p中保存该结点的地址,//若不存在这个值,则p中保存查找路径上的最后一个结点的位置,并返回0{if(!T){p=f;return 0;}else if(EQ(T->data.key,key)){p=T;return 1;}else if(LT(T->data.key,key))SearchBST(T->rchild,key,T,p);elseSearchBST(T->lchild,key,T,p);}int InsertBST(BSTree &T,ElemType e){BSTree p;if(!SearchBST(T,e.key,NULL,p))//首先在树中查找是存在与待插关键字相等的元素,如果存在,返回0,不存在,p中已经保存待插位置的地址{BSTree s=(BSTree)malloc(sizeof(BSTNode));s->data=e;s->lchild=s->rchild=NULL;if(!p)//如果p是空树的话T=s;else if(LT(e.key,p->data.key))//如果待插结点的值小于双亲结点的值,则插在左孩子中p->lchild=s;else//否则插入右孩子中p->rchild=s;return 1;}elsereturn 0;}void Delete1(BSTree & p)//删除p这个结点,由于整个二叉排序树中序遍历是有序的,//所以当p点结点的值删除后,p点若从子树中的结点中选取一个替换p结点,//则这个结点要保证比不小于左子树所有结点,不大于右子树中所有结点//因此可以选取p结点的前驱结点,就是左子树的第一个结点的,一直向右走的最后一个结点即可{BSTree q;if(p->lchild==NULL)//如果左子树为空,只需要讲右子树的第一个结点往前提一个即可{q=p;p=p->rchild;free(q);}else if(p->rchild==NULL){q=p;p=p->lchild;free(q);}else{BSTree s=p->lchild;q=p;while(s->rchild!=NULL){q=s;s=s->rchild;}p->data=s->data;if(q!=p)q->rchild=s->rchild;elseq->lchild=s->lchild;}}int DeleteBST(BSTree &T,KeyType key){if(!T)return 0;else{if(EQ(key,T->data.key))Delete1(T);else if(LT(key,T->data.key))DeleteBST(T->lchild,key);elseDeleteBST(T->rchild,key);return 1;}}void InOrderTraverse(BSTree T){if(T){InOrderTraverse(T->lchild);printf("%d ",T->data.key);InOrderTraverse(T->rchild);}}int main(){BSTree T,p;InitBSTree(T);int i;ElemType e[6];e[0].key=45;e[1].key=24 ;e[2].key=53;e[3].key=12 ;e[4].key=37 ;e[5].key=93 ;for(i=0;i<6;i++)InsertBST(T,e[i]);InOrderTraverse(T);printf("\n");SearchBST(T,54,NULL,p);printf("%d\n",p->data.key);DeleteBST(T,24);InOrderTraverse(T);}
- 数据结构_查找_动态查找表_二叉排序树
- 数据结构_查找_静态查找数表_二叉排序树
- 数据结构(C#)_查找(动态查找)
- 二叉排序树_插入+删除+查找
- 数据结构_静态查找表
- 数据结构_查找_次优查找树
- 数据结构_折半查找
- 数据结构_折半查找
- 【数据结构_树_Tree_1011】二叉排序树的实践和查找
- 从零开始_学_数据结构(四)——查找算法、索引、二叉排序树
- 常用数据结构_排序_查找练习
- 【C语言】查找_数据结构_练习
- 数据结构_二叉查找树
- 数据结构基础_二分法查找
- 数据结构(C#)_查找(静态查找)
- 数据结构_查找_平衡二叉树_插入
- 五大经典查找(1)_二叉排序树查找
- 查找_二分查找
- NLP常用工具
- IOS 网络编程 + 后台保持连接
- 2012年软件开发者薪资调查报告
- Crisis of HDU+母函数
- 第一篇windows phone 7博客:windows phone 7 上编写录音软件全纪录
- 数据结构_查找_动态查找表_二叉排序树
- 制作可启动的用于安装Windows7的USB
- 《Android内核剖析》读书笔记 第9章 Framework的启动过程
- cocos2d-x 浅析斗地主游戏分牌动作
- 启动oracledbconsoleorcl 发生服务特定错误: 2
- spring+hibernate,采用声明式事务
- IDA反汇编/反编译静态分析iOS模拟器程序(五)F5反编译
- 德国最愚蠢的银行
- java本地接口调用基础篇一(共四篇)