二叉排序树(BST) 二叉排序树是空树或者是满足如下性质的树
(1)若它的左子树不空,则左子树上所有关键字的值均小于关键字的值
(2)若它的右子树不空,则右子树上所有关键字的值均大于跟关键字的值。
(3)左右子树各是一颗二叉排序树。
说明: 在二叉排序树中插入关键字均为在新建的叶子上,由于找的的插入位置总是空指针域上。
因此,在空指针域上连接一个新结点必为叶子结点
#define LOCAL
#include<cstdio>
#include<cstdlib>
#include<iostream>
using namespace std;
typedef int ElemType;
const int maxSize=10000;
typedef struct BTNode
{
ElemType key;
struct BTNode *lChild;
struct BTNode *rChild;
}BTNode;
/*
插入关键字算法
二叉排序树是一个查找表,插入一个关键字首先要找到插入位置,对于不存在于二叉
树种的关键字,其查找不成功的位置即为关键字的插入位置。
*/
int BSTInsert(BTNode *&bt,int key)
{
if(bt==NULL)
{
bt=(BTNode *)malloc(sizeof(BTNode));
bt->lChild=bt->rChild=NULL;
bt->key=key;
return 1;
}
else
{
if(key==bt->key)
{
return 0;
}
else if(key<bt->key)
{
return BSTInsert(bt->lChild,key);
}
else
{
return BSTInsert(bt->rChild,key);
}
}
}
BTNode* BSTSearch(BTNode *bt,int key)
{
if(bt==NULL)
{
return NULL;
}
else if(bt->key==key)
{
return bt;
}
else if(key<bt->key)
{
return BSTSearch(bt->lChild,key);
}
else
{
return BSTSearch(bt->rChild,key);
}
}
/*
建立二叉排序树是,只要建立一颗空树,然后将关键字逐个插入到空树中,即可构
造一颗二叉排序树,算法如下:假设关键字已存入数组key[],且下标是从1开始。
*/
void CreateBST(BTNode *&bt,int key[],int n)
{
int i=0;
bt=NULL;
for(i=1;i<=n;i++)
{
BSTInsert(bt,key[i]);
}
}
int SearchR(int R[],int k,int n)
{
int flag=0;
for(int i=0;i<n;i++)
{
if(R[i]==k)
{
flag=1;
break;
}
}
return flag;
}
int main()
{
#ifdef LOCAL
freopen("data.in","r",stdin);
freopen("data.out","w",stdout);
#endif
int R[maxSize],n,i,key;
BTNode *bt,*search;
cin>>n;
for(i=0;i<n;i++)
{
cin>>R[i];
}
CreateBST(bt,R,n);
cin>>key;
search=BSTSearch(bt,key);
if(search!=NULL)
{
cout<<search->key<<endl;
}
else
{
cout<<"0
";
}
//查数组找验证二叉排序树执行结果是否正确
if(SearchR(R,key,n))
{
cout<<key<<endl;
}
else{
cout<<"0
";
}
return 0;
}