次优查找树

来源:互联网 发布:红雪越狱软件 编辑:程序博客网 时间:2024/05/20 14:22



#include <iostream>#include <iomanip>#include <cmath>using namespace std;typedef struct treenode{    struct treenode *left;    char data;    int weight;    struct treenode *right;}Treenode,* Treep;int low=1,high=10;char *R;int *weight;    int *sw;//初始化二叉树void init_tree(Treep &root){    root=NULL;    cout<<"初始化成功!"<<endl;}//创建二叉树void SecondOptimal(Treep &rt, char R[],int sw[], int low, int high){    //由有序表R[low....high]及其累积权值表sw(其中sw[0]==0)递归构造次优查找树T    int i=low;    int min = fabs(sw[high] - sw[low]);    int dw = sw[high] + sw[low-1];    for(int j=low+1; j<=high; ++j)        //选择最小的ΔPi值    {        if(fabs(dw-sw[j]-sw[j-1]) < min)        {            i=j;            min=fabs(dw-sw[j]-sw[j-1]);        }    }    rt=(Treep)malloc(sizeof(Treenode));    rt->data=R[i];        //生成节点    if(i==low)            //左子树为空        rt->left = NULL;    else                //构造左子树        SecondOptimal(rt->left, R, sw, low, i-1);    if(i==high)            //右子树为空        rt->right = NULL;    else                //构造右子树        SecondOptimal(rt->right, R, sw, i+1, high);}//SecondOptimal//前序遍历二叉树void pre_order(Treep &rt){    if(rt!=NULL)    {        cout<<rt->data<<"  ";        pre_order(rt->left);        pre_order(rt->right);    }}//查找二叉树中是否存在某元素int seach_tree(Treep &rt,char key){    if(rt==NULL)         return 0;     else     {         if(rt->data==key)         {            return 1;        }        else        {            if(seach_tree(rt->left,key) || seach_tree(rt->right,key))                return 1;    //如果左右子树有一个搜索到,就返回1            else                return 0;    //如果左右子树都没有搜索到,返回0        }    }}int main(){    Treep root;    init_tree(root);        //初始化树    R=(char *)malloc( high*sizeof(char) );    for(int i=low; i<high; i++)        R[i]='A'+i-1;    cout<<"构造次优查找树的点R[]:"<<endl;    for(i=low-1; i<high; i++)        cout<<setw(3)<<R[i]<<"  ";    cout<<endl;        weight=(int *)malloc( high*sizeof(int) );    weight[0]=0;    weight[1]=1;    weight[2]=1;    weight[3]=2;    weight[4]=5;    weight[5]=3;    weight[6]=4;    weight[7]=4;    weight[8]=3;    weight[9]=5;    cout<<"构造次优查找树的点的权值weight[]:"<<endl;    for(i=low-1; i<high; i++)        cout<<setw(3)<<weight[i]<<"  ";    cout<<endl;        sw=(int *)malloc( high*sizeof(int) );    sw[0]=0;    for(i=low; i<high; i++)    {        sw[i]=sw[i-1]+weight[i];    }    cout<<"构造次优查找树的点累积权值sw[]:"<<endl;    for(i=low-1; i<high; i++)        cout<<setw(3)<<sw[i]<<"  ";    cout<<endl;    //创建二叉树    SecondOptimal(root, R, sw, low, high-1);    //前序遍历二叉树    cout<<endl<<"前序遍历序列是:"<<endl;    pre_order(root);    cout<<endl;    //查找二叉树中是否存在某元素    cout<<"输入要查找的元素!"<<endl;    char ch;    cin>>ch;    if(seach_tree(root,ch)==1)        cout<<"yes!"<<endl;    else        cout<<"no!"<<endl;    return 0;}


原创粉丝点击