• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            posts - 6,  comments - 30,  trackbacks - 0

            二叉查找樹(BST),顧名思義,其有利于數(shù)據(jù)的查找、搜索。
            所謂二叉查找樹:
              1、其有可能是一顆空樹。
              2、若不是空樹
                       =每個節(jié)點有一個關(guān)鍵值(在這里假設(shè)每兩個元素沒有相同的關(guān)鍵值,對于相同的可以根據(jù)具體問題需要來設(shè)計自己的BST)
                       =根節(jié)點的關(guān)鍵值(如果有)比左子樹關(guān)鍵值大,但是比右子樹關(guān)鍵值小。
                       =根節(jié)點的左右子樹也是二叉查找樹(BST)。
            現(xiàn)在就具體問題具體分析。
             構(gòu)建一個BST,在BST中查找一個關(guān)鍵值,如果查找成功則顯示查找成功和比較次數(shù)
                                                                                   如果查找不成功則顯示查找成功和比較次數(shù)

            首先定義二叉查找樹的節(jié)點
            ADT BSTNode
            操作對象:其關(guān)鍵值data
            基本操作:
              BSTNode();//構(gòu)建一個節(jié)點

              ~BSTNode();//撤銷節(jié)點

            ADT BSTree
            操作對象:BSTNode
            基本操作:
            BSTree();//構(gòu)建空BST
             void insert(int k);    //向該樹中插入K
             bool Search(BTreeNode* node1,int k,int&); //搜索根節(jié)點node的數(shù)且值為k節(jié)點
             void DeleteBST(BTreeNode *);        //刪除樹釋放空間
             BTreeNode* Getroot(){return Root;}//返回根節(jié)點,以便外部函數(shù)調(diào)用
             int Getcount(){return count;}  //返回搜索的次數(shù)
             int GetSize(){return size;}  //返回該樹節(jié)點數(shù)
             void Clear(){count=0;}    //用于每次搜索完后將搜索次數(shù)清0,以便記錄下次搜索的次數(shù)
             ~BSTree();                //撤銷BST
            其代碼如下
              1#include<iostream.h>
              2const int MaxSize=100;
              3class BSTree;
              4/*
              5**節(jié)點定義及構(gòu)造函數(shù)的實現(xiàn)
              6*/

              7class BTreeNode{    
              8    friend class BSTree;  //申明友元以便訪問其私有變量
              9public:
             10    BTreeNode(){
             11        left=NULL;
             12        right=NULL;
             13    }

             14private:
             15    int data;
             16    BTreeNode* left;
             17    BTreeNode* right;
             18}
            ;
             19/*
             20**BST的定義
             21*/

             22class BSTree{
             23public:
             24    BSTree();
             25    void insert(int k);    //向該樹中插入K
             26    bool Search(BTreeNode* node1,int k,int&); //搜索根節(jié)點node的數(shù)且值為k節(jié)點
             27    void DeleteBST(BTreeNode *);        //刪除樹釋放空間
             28    BTreeNode* Getroot(){return Root;}//返回根節(jié)點,以便外部函數(shù)調(diào)用
             29    int Getcount(){return count;}  //返回搜索的次數(shù)
             30    int GetSize(){return size;}  //返回該樹節(jié)點數(shù)
             31    void Clear(){count=0;}       //用于每次搜索完后將搜索次數(shù)清0,以便記錄下次搜索的次數(shù)
             32    ~BSTree();                //釋放內(nèi)存
             33private:
             34    BTreeNode* Root;
             35    int size;         //記錄該二叉查找樹的大小
             36    int count;        //記錄比較次數(shù)
             37}
            ;
             38/*
             39**BST的實現(xiàn)
             40*/

             41BSTree::BSTree(){
             42    count=0;     //記錄數(shù)據(jù)清0
             43    int n;
             44    cout<<"請輸入BST節(jié)點個數(shù):";
             45    cin>>n;
             46    size=n;          //輸入二叉查找樹的大小
             47    Root=NULL;     
             48}

             49void BSTree::insert(int k){
             50    BTreeNode* p=Root;
             51    BTreeNode* pp=NULL;
             52    while(p){
             53        pp=p;
             54        if(p->data>k)
             55            p=p->left;
             56        else
             57            p=p->right;
             58    }

             59    BTreeNode* R=new BTreeNode;
             60    R->data=k;
             61    if(Root){
             62        if(pp->data>k)
             63            pp->left=R;
             64        else
             65            pp->right=R;
             66    }

             67    else
             68        Root=R;
             69}

             70bool BSTree::Search(BTreeNode* r,int k,int &e){  
             71    if(r){//查找關(guān)鍵值為k,并用e保存
             72        if(r->data==k){
             73            e=r->data;
             74            count++;
             75            return true;
             76        }

             77        else if(r->data>k ) {  
             78            count++;
             79                Search(r->left,k,e); 
             80        }

             81        else if(r->data<k)
             82            count++;
             83            Search(r->right,k,e);
             84        }

             85    }

             86    else
             87        return false;
             88}

             89void BSTree::DeleteBST(BTreeNode *r){
             90    if(r){//按照后序遍歷的方式刪除該樹
             91        DeleteBST(r->left); 
             92        DeleteBST(r->right);
             93        delete r;
             94        r=NULL;
             95    }

             96}

             97BSTree::~BSTree(){
             98    DeleteBST(Root);
             99}

            100/*
            101測試
            102*/

            103void main()
            104{
            105    BSTree bst;
            106    int Array[MaxSize];
            107    cout<<"請輸入二叉查找樹的數(shù)據(jù):";
            108    for(int i=0;i<bst.GetSize();i++)
            109    {  
            110        cin>>Array[i];
            111    }

            112    for(i=0;i<bst.GetSize();i++)
            113    {
            114        bst.insert(Array[i]);
            115    }

            116    int k,x;
            117    cout<<"請輸入要查找的數(shù):";
            118        cin>>k;
            119    while(bst.Search(bst.Getroot(),k,x))
            120    {
            121        cout<<"查找成功!  比了"<<bst.Getcount()<<""<<endl;
            122        bst.Clear();
            123        cout<<"請輸入要查找的數(shù):";
            124        cin>>k;
            125    }

            126    cout<<"查找不成功!  比了"<<bst.Getcount()<<""<<endl;
            127    cin.get();
            128
            129}

            130    
            131
            132
            posted on 2011-01-08 21:01 あ維wêiセ 閱讀(1923) 評論(0)  編輯 收藏 引用 所屬分類: C++
            <2012年8月>
            2930311234
            567891011
            12131415161718
            19202122232425
            2627282930311
            2345678

            常用鏈接

            留言簿(1)

            隨筆分類

            隨筆檔案

            文章分類

            文章檔案

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            国产精品久久久久久一区二区三区| 91亚洲国产成人久久精品网址| 99久久精品国产一区二区| 久久综合亚洲鲁鲁五月天| 久久久精品免费国产四虎| 久久se这里只有精品| 五月丁香综合激情六月久久| 99久久精品国产一区二区蜜芽| 国内精品久久久人妻中文字幕| 一97日本道伊人久久综合影院| 国产精品美女久久久网AV| 狠狠色噜噜色狠狠狠综合久久| 日韩AV毛片精品久久久| 国产精品久久网| 无码人妻精品一区二区三区久久 | 久久综合亚洲色一区二区三区| 久久99精品国产麻豆蜜芽| 欧美va久久久噜噜噜久久| 久久婷婷五月综合97色一本一本| 久久精品一区二区三区AV| 久久久久国产精品人妻| 国产精品亚洲美女久久久| 91精品国产综合久久精品| 韩国无遮挡三级久久| 狠狠色丁香久久综合婷婷| 久久久无码精品亚洲日韩按摩| 色8久久人人97超碰香蕉987| 亚洲色大成网站WWW久久九九| 精品久久亚洲中文无码| 伊人 久久 精品| 久久久久久毛片免费看| 国产精品热久久毛片| 国产激情久久久久影院小草| 国产一区二区精品久久| 国产999精品久久久久久| 无码任你躁久久久久久老妇| 久久久久香蕉视频| 久久婷婷五月综合成人D啪| 久久国产福利免费| 久久久久亚洲精品天堂久久久久久 | 午夜人妻久久久久久久久|