1. 程式人生 > >C++程式碼,資料結構-次優查詢樹

C++程式碼,資料結構-次優查詢樹

     當有序表中的個記錄的查詢概率不等時,要是的查詢效能最優,根據折半查詢的判定樹可知,可以建立靜態最優查詢樹,但是構造最優查詢樹的花費的時間代價能大,所以書上介紹了一個二叉樹——次優查詢二叉樹,它的建立方法,書上講了,但是原理沒有說,我也無從得知,只能按照書上的演算法,先建立次優二叉樹。

關鍵字 A B C D E F G H I

權值    1   1 2 5 3 4  4  3 5

#include<iostream>
#include<fstream>
#include<cstdlib>
#include<queue>
using namespace std;
 struct Binode{
     char data;
     Binode *lchild,*rchild;
};
typedef Binode* Bitree;

void vist(char c){
cout<<c<<"   ";}



void Creatsw(int sw[],int quan[],int n){
for(int i=0;i!=n+1;++i){  int x=0;
    for(int j=0;j!=i;++j){

x+=quan[j];

    } sw[i]=x;
}


}

void Second_option(Bitree &T,char ch[],int sw[],int low,int high){//利用書上的建立方法,原理我也不知道
int mins=abs(sw[high]-sw[low]),dw=sw[high]+sw[low-1];
int i=low;
for(int j=low+1;j<=high;++j){
    if(abs(dw-sw[j]-sw[j-1])<mins){
        i=j;
        mins=abs(dw-sw[j]-sw[j-1]);
    }
}
T=new Binode;
T->data=ch[i-1];
if(i==low)T->lchild=NULL;
else Second_option(T->lchild,ch,sw,low,i-1);
if(i==high)T->rchild=NULL;
else Second_option(T->rchild,ch,sw,i+1,high);

}

void Traval_bitree_cengci(Bitree T){//層次遍歷
queue<Bitree>sq;
sq.push(T);
Bitree P;
while(!sq.empty()){
    P=sq.front();
 vist(P->data);
    if(P->lchild){sq.push(P->lchild);}
    if(P->rchild){sq.push(P->rchild);}
 sq.pop();
}



}





int main(){
ifstream infile("rebuf.txt");
streambuf* backup=cin.rdbuf();
cin.rdbuf(infile.rdbuf());
int n;
cin>>n;
char ch[n];
int quan[n];
for(int i=0;i!=n;++i){
     cin>>ch[i]>>quan[i];
}
int sw[n+1];
Creatsw(sw,quan,n);//建立累計權值和。sw[0]=0;
Bitree T;

int low=1,high=9;
Second_option(T,ch,sw,low,high);//建立次優查詢樹
cout<<endl;

Traval_bitree_cengci(T);//層次遍歷的結果
return 0;
}
rebuf.txt:

9
a 1 
b 1
c 2
d 5
e 3
f 4
g 4
h 3
i 5

執行結果:

其次,在構造的時候,沒有考察單個關鍵字的相信權值,則有可能出現被選為根的關鍵字的權值比與它相鄰的關鍵字的權值小,此時應作調整:

選取鄰近的權值較大的關鍵字做為根節點。