zoukankan      html  css  js  c++  java
  • 二叉排序树(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
    ";
        }
        //查数组找验证二叉排序树执行结果是否正确 
        if(SearchR(R,key,n))
        {
            cout<<key<<endl;    
        }
        else{
            cout<<"0
    ";
        }
        return 0;
    }
  • 相关阅读:
    网络流,再出发!
    2SAT
    并查集
    最大密度子图
    网络流提高专题(洛谷题单)
    JQuery 操作 ListBox间移动和ListBox内移动
    关于多表Update和Delete的应用
    XML格式与DataTable、DataSet、DataView格式的转换
    FCKeditor配置和精简
    点击fileupload后button事件不起作用
  • 原文地址:https://www.cnblogs.com/jianfengyun/p/4020607.html
Copyright © 2011-2022 走看看