二叉排序树(BST)

二叉排序树(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\n";
    }
    //查数组找验证二叉排序树执行结果是否正确 
    if(SearchR(R,key,n))
    {
        cout<<key<<endl;    
    }
    else{
        cout<<"0\n";
    }
    return 0;
}

 

posted @ 2014-10-12 15:40  剑风云  阅读(362)  评论(0编辑  收藏  举报