首先介绍下基本概念:二叉排序树是一棵二叉树,或者为空,或者满足以下条件:
①若左子树不空,则其上的值均小于根的值;
②若右子树不空,其上的值均不小于根的值;
③左右子树也是二叉排序树
下面以基本的构造二叉排序树和查找其中的元素来说明其基本的算法。
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);
else
insert(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);
else
return 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;
else
p=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;
else
cout<<"q==NULL"<<endl;
return 0;
}