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

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

              ~BSTNode();//撤銷節點

            ADT BSTree
            操作對象:BSTNode
            基本操作:
            BSTree();//構建空BST
             void insert(int k);    //向該樹中插入K
             bool Search(BTreeNode* node1,int k,int&); //搜索根節點node的數且值為k節點
             void DeleteBST(BTreeNode *);        //刪除樹釋放空間
             BTreeNode* Getroot(){return Root;}//返回根節點,以便外部函數調用
             int Getcount(){return count;}  //返回搜索的次數
             int GetSize(){return size;}  //返回該樹節點數
             void Clear(){count=0;}    //用于每次搜索完后將搜索次數清0,以便記錄下次搜索的次數
             ~BSTree();                //撤銷BST
            其代碼如下
              1#include<iostream.h>
              2const int MaxSize=100;
              3class BSTree;
              4/*
              5**節點定義及構造函數的實現
              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&); //搜索根節點node的數且值為k節點
             27    void DeleteBST(BTreeNode *);        //刪除樹釋放空間
             28    BTreeNode* Getroot(){return Root;}//返回根節點,以便外部函數調用
             29    int Getcount(){return count;}  //返回搜索的次數
             30    int GetSize(){return size;}  //返回該樹節點數
             31    void Clear(){count=0;}       //用于每次搜索完后將搜索次數清0,以便記錄下次搜索的次數
             32    ~BSTree();                //釋放內存
             33private:
             34    BTreeNode* Root;
             35    int size;         //記錄該二叉查找樹的大小
             36    int count;        //記錄比較次數
             37}
            ;
             38/*
             39**BST的實現
             40*/

             41BSTree::BSTree(){
             42    count=0;     //記錄數據清0
             43    int n;
             44    cout<<"請輸入BST節點個數:";
             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){//查找關鍵值為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<<"請輸入二叉查找樹的數據:";
            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<<"請輸入要查找的數:";
            118        cin>>k;
            119    while(bst.Search(bst.Getroot(),k,x))
            120    {
            121        cout<<"查找成功!  比了"<<bst.Getcount()<<""<<endl;
            122        bst.Clear();
            123        cout<<"請輸入要查找的數:";
            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セ 閱讀(1941) 評論(0)  編輯 收藏 引用 所屬分類: C++
            <2012年8月>
            2930311234
            567891011
            12131415161718
            19202122232425
            2627282930311
            2345678

            常用鏈接

            留言簿(1)

            隨筆分類

            隨筆檔案

            文章分類

            文章檔案

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            久久亚洲精品无码AV红樱桃| 精品少妇人妻av无码久久| 精品一区二区久久久久久久网站| 久久人人爽人人人人爽AV| 少妇久久久久久被弄到高潮| 久久人人爽人人爽AV片| 狠狠精品干练久久久无码中文字幕| 精品国产福利久久久| 99久久精品免费看国产一区二区三区| 99精品久久久久中文字幕| 亚洲国产成人久久综合碰碰动漫3d| 波多野结衣中文字幕久久| 国产精品青草久久久久婷婷 | 婷婷国产天堂久久综合五月| 亚洲欧美精品一区久久中文字幕| 久久精品国产欧美日韩99热| 一本一道久久综合狠狠老| 99久久中文字幕| 久久精品国产亚洲精品| 久久久久久精品免费免费自慰| 亚洲AV日韩精品久久久久久| 久久精品国产亚洲AV无码麻豆| 久久夜色tv网站| 伊人久久精品影院| .精品久久久麻豆国产精品| 久久天天躁狠狠躁夜夜不卡| 亚洲国产精品无码久久久秋霞2 | 久久久久久青草大香综合精品| 亚洲第一永久AV网站久久精品男人的天堂AV| 天天影视色香欲综合久久| 久久久久国产精品人妻| 久久精品嫩草影院| 亚洲午夜无码久久久久| 国产农村妇女毛片精品久久| 亚洲人成精品久久久久| 久久播电影网| 少妇人妻88久久中文字幕| 日韩久久久久中文字幕人妻| 国产成人精品久久免费动漫| 欧美成人免费观看久久| 久久久久国产一级毛片高清板|