树表查找之二叉排序树
来源:互联网 发布:怎样关闭服务器80端口 编辑:程序博客网 时间:2024/03/29 10:29
首先介绍下基本概念:二叉排序树是一棵二叉树,或者为空,或者满足以下条件:
①若左子树不空,则其上的值均小于根的值;
②若右子树不空,其上的值均不小于根的值;
③左右子树也是二叉排序树
下面以基本的构造二叉排序树和查找其中的元素来说明其基本的算法。
1、构造
构造的基本思想:假设已存在一棵二叉排序树,需要向其上添加元素。方法是新建一个指向node类型的
指针,将key装入该指针指向的区域,然后遍历二叉排序树以寻找到合适的位置,将新建节点链接上。至于如
何寻找合适位置,则是根据二叉排序树的特点,在左右子树不断寻找,直到找到一个合适的NULL位置。详见
代码。
2、查找
先比较根节点的关键字与待查元素的大小关系。如果相等,则表明查找到,查找结束;否则,如果前者大
于后者,则在左子树中查找;否则,在右子树中查找。
代码如下:
#include<iostream>using namespace std;struct node //节点包含一个关键字和左右两个指向节点的指针{int key;node *lchild;node *rchild;};class bin_search_t //二叉排序树类{public:bin_search_t();void insert(node *&T,node *u);void create_bst(node *&T);node* visit(node *T,int value);node *root;};bin_search_t::bin_search_t(){root=NULL; //root为NULL决定了insert()和create_bst()都得用root的引用}void bin_search_t::insert(node *&T,node *u) //将u指示的节点元素插入到以T为根的排序树中{if(T==NULL) //每次都是在空处链接T=u;else if(u->key>T->key)insert(T->rchild,u);elseinsert(T->lchild,u);}void bin_search_t::create_bst(node *&T) //需要引用,因为下面有T=NULL语句,不引用就无法从root处访问了{node *u=NULL;const int MAX=9999; //标志构造结束int x;while(1) {cin>>x;if(x==MAX) break;u=new node; u->key=x;u->lchild=NULL;u->rchild=NULL;insert(T,u);}}/*递归查找*/node* bin_search_t::visit(node *T,int value){if(T==NULL || T->key==value ) //把T==NULL放在前面会省去很多麻烦,因为当T==NULL时,T->key会出错return T;else if(T->key>value)return visit(T->lchild,value);elsereturn visit(T->rchild,value);}/*非递归查找node* bin_search_t_n::visit(node *T,int value){node *p=T;while(p!=NULL){if(p->key==value)return p;else if(p->key>value)p=p->lchild;elsep=p->rchild;}return p;}*/int main(){bin_search_t p;node *q;p.create_bst(p.root);q=p.visit(p.root,9); //以查找9为例 cout<<q<<endl; //输出9的位置if(q!=NULL) //根据是否查找的,输出 cout<<q->key<<endl;elsecout<<"q==NULL"<<endl;return 0;}
- 树表查找之二叉排序树
- 树表查找之二叉排序树
- 动态查找表之二叉排序树
- 动态查找表之二叉排序树
- 动态查找之二叉排序树
- 查找系列之二叉排序树
- 查找之二:二叉排序树
- 查找算法之二叉排序树
- 动态查找之-二叉排序树
- 查找之二叉排序树
- 二叉排序树之查找算法
- 查找算法之二叉排序树查找
- 数据结构(22)--动态查找之二叉排序树(二叉查找树)
- 动态查找表之二叉排序树的查找、遍历、删除
- 查找树-------二叉排序树
- 二叉排序树-动态查找表
- 查找算法三之二叉排序树
- 第七章:查找之二叉排序树
- Hadoop执行DistributedGrep
- foxmail替代outlook完成邮件管理、时间管理(谷歌日历同步)、rss订阅
- 从设计的角度讨论Java中线程的两种创建方式
- 开源软件清除了“开源”和“商业”之间的障碍——商业软件、开源软件和自由软件的区别
- 用单链表实现stack
- 树表查找之二叉排序树
- tbr tbn tbc
- android:SDL init failure, reason is: No available video device
- 四则运算,简单的,只有个位数加减
- 解析成功手机游戏的10种特征和共性
- 温故知新
- 黑马程序员_html常用标签1
- python2.5中使用OpenCV
- 'PIO_STACK_LOCATION' : illegal use of this type as an expression