次优二叉树

  在有序序列的查找中,如果各个元素的查找概率都是一样的,那么二分查找是最快的查找算法,但是如果查找元素的查找概率是不一样的,那么用二分查找就不一定是最快的查找方法了,可以通过计算ASL来得知。所以基于这种查找元素概率不想等的有序序列,可以通过构造最优二叉树的方法,使得该二叉树的带权路径长度最小,这样的二叉树的构造代价是非常大的,所以用一种近似的算法,构造次优查找树,该树的带权路径长度近似达到最小。

  数据结构中算法描述为:

  

  1 #include <iostream>
  2 #include <cmath>
  3 #include <cstdlib>
  4 #include <iomanip>
  5 
  6 using namespace std;
  7 
  8 typedef struct treenode
  9 {
 10     char data;
 11     int weight;
 12     treenode *left;
 13     treenode *right;
 14 }Treenode,*Treep;
 15 
 16 //初始化二叉树
 17 void init_tree(Treep &root)
 18 {
 19     root=NULL;
 20     cout<<"初始化成功!"<<endl;
 21 }
 22 
 23 //创建二叉树
 24 void SecondOptimal(Treep &rt, char R[],int sw[], int low, int high)
 25 {
 26     //由有序表R[low....high]及其累积权值表sw(其中sw[0]==0)递归构造次优查找树T
 27     int i = low;
 28     //int min = abs(sw[high] - sw[low]);
 29     int dw = sw[high] - sw[low-1];
 30     int min = dw;
 31     for(int j=low+1; j<=high; ++j)        //选择最小的ΔPi值
 32     {
 33         if(abs(dw-sw[j]-sw[j-1]) < min)
 34         {
 35             i=j;
 36             min=abs(dw-sw[j]-sw[j-1]);
 37         }
 38     }
 39     rt=new Treenode;
 40     rt->data=R[i];        //生成节点
 41     if(i==low)            //左子树为空
 42         rt->left = NULL;
 43     else                //构造左子树
 44         SecondOptimal(rt->left, R, sw, low, i-1);
 45 
 46     if(i==high)            //右子树为空
 47         rt->right = NULL;
 48     else                //构造右子树
 49         SecondOptimal(rt->right, R, sw, i+1, high);
 50 }//SecondOptimal
 51 
 52 //前序遍历二叉树
 53 void pre_order(Treep rt)
 54 {
 55     if(rt)
 56     {
 57         cout<<rt->data<<"  ";
 58         pre_order(rt->left);
 59         pre_order(rt->right);
 60     }
 61 }
 62 
 63 //中序遍历二叉树
 64 void in_order(Treep rt)
 65 {
 66     if(rt)
 67     {
 68         in_order(rt->left);
 69         cout<<rt->data<<"  ";
 70         in_order(rt->right);
 71     }
 72 }
 73 
 74 //后序遍历二叉树
 75 void post_order(Treep rt)
 76 {
 77     if(rt)
 78     {
 79         post_order(rt->left);
 80         post_order(rt->right);
 81         cout<<rt->data<<"  ";
 82     }
 83 }
 84 
 85 //查找二叉树中是否存在某元素
 86 int seach_tree(Treep &rt,char key)
 87 {
 88     if(rt==NULL) 
 89         return 0; 
 90     else 
 91     { 
 92         if(rt->data==key) 
 93         {
 94             return 1;
 95         }
 96         else
 97         {
 98             if(seach_tree(rt->left,key) || seach_tree(rt->right,key))
 99                 return 1;    //如果左右子树有一个搜索到,就返回1
100             else
101                 return 0;    //如果左右子树都没有搜索到,返回0
102         }
103     }
104 }
105 
106 int main()
107 {
108     Treep root;
109     init_tree(root);        //初始化树
110     int low=1, high=10;
111     int *weight, *sw;
112     char *R;
113     
114     R=new char[high];
115     for(int i=low; i<high; i++)
116         R[i]='A'+i-1;
117     cout<<"构造次优查找树的点R[]:"<<endl;
118     for(int i=low; i<high; i++)
119         cout<<setw(3)<<R[i]<<"  ";
120     cout<<endl;
121     
122     weight=new int[high];
123     weight[0]=0;
124     weight[1]=1;
125     weight[2]=1;
126     weight[3]=2;
127     weight[4]=5;
128     weight[5]=3;
129     weight[6]=4;
130     weight[7]=4;
131     weight[8]=3;
132     weight[9]=5;
133     cout<<"构造次优查找树的点的权值weight[]:"<<endl;
134     for(int i=low; i<high; i++)
135         cout<<setw(3)<<weight[i]<<"  ";
136     cout<<endl;
137         
138     sw=new int[high];
139     sw[0]=0;
140     for(int i=low; i<high; i++)
141     {
142         sw[i]=sw[i-1]+weight[i];
143     }
144     cout<<"构造次优查找树的点累积权值sw[]:"<<endl;
145     for(int i=low; i<high; i++)
146         cout<<setw(3)<<sw[i]<<"  ";
147     cout<<endl;
148         
149     //创建二叉树
150     SecondOptimal(root, R, sw, low, high-1);
151     
152     cout<<"前序遍历序列是:"<<endl;
153     pre_order(root);
154     cout<<endl;
155     
156     cout<<"中序遍历序列是:"<<endl;
157     in_order(root);
158     cout<<endl;
159 
160     cout<<"后序遍历序列是:"<<endl;
161     post_order(root);
162     cout<<endl;
163 
164     //查找二叉树中是否存在某元素
165     cout<<"输入要查找的元素!"<<endl;
166     char ch;
167     cin>>ch;
168     if(seach_tree(root,ch)==1)
169         cout<<"Yes"<<endl;
170     else
171         cout<<"No"<<endl;
172     while(1);
173     return 0;
174 }

  运行结果如下:
  

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/301323.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

每日一笑 | 老板,黑凤梨真的能吃吗?

全世界只有3.14 % 的人关注了数据与算法之美&#xff08;图片来源于网络&#xff0c;侵权删&#xff09;

crontab执行shell脚本日志中出现乱码

使用nutch开源的搜索引擎抓取网页信息&#xff0c;通过计划任务crontab执行shell脚本&#xff0c;并将启动信息记录进日志文件&#xff0c;但是每次都会出现乱码&#xff0c;如图所示经过反复测试&#xff0c;排除了java程序问题&#xff0c;文件权限问题&#xff0c;系统字符集…

学好数学建模,走哪买菜都不怕!

随着新学期的开始&#xff0c;数学建模的热度也在逐步回温&#xff08;据说大家开始了数学建模知识储备&#xff09;&#xff0c;常有小伙伴私聊小天咨询关于数学建模的事情。大大小小的数学建模比赛如火如荼开展着&#xff0c;而如何快速掌握数学建模&#xff0c;做好充足的准…

[翻译]Go与C#的比较,第二篇:垃圾回收

Go vs C#, part 2: Garbage Collection | by Alex Yakunin | ServiceTitan — Titan Tech | Medium目录译者注什么是垃圾回收&#xff1f;什么是GCBurn&#xff1f;峰值分配吞吐量&#xff08;"速度测试"&#xff09;GCBurn 测试GC Burn测试结果结论.NET CoreGo两者…

写在《ASP.NET MVC 4 Web 编程》即将出版之际!献给有节操的程序员!

《Programming ASP.NET MVC 4》中文版即将上市了&#xff01;非常荣幸我可以再次参与一本不错的技术书籍的翻译工作。 这也是在《WCF技术内幕》与《WCF服务编程》第三版之后&#xff0c;翻译的第三本书。此书由世界上最著名的计算机出版社Oreilly出版&#xff0c;中文版本由华中…

日本码农为了萝莉,竟然在GitHub上做这种事,“警察,快来抓我啊!”

全世界只有3.14 % 的人关注了数据与算法之美近日&#xff0c;日本刈谷市警方抓了一名13岁的小女孩&#xff0c;原因是“她将一段恶意代码的链接放到了网上&#xff0c;导致一千多台电脑系统崩溃。”其实&#xff0c;这就是一个入门级的恶作剧无限弹窗而已&#xff0c;只要你点了…

带老弟做个实时排行榜

阿巴可懂的实时排行榜设计和实现思路。大家好&#xff0c;我是鱼皮&#xff0c;暑假快到了&#xff0c;我的老弟小阿巴听说我家有很多好康的&#xff0c;就跑来找我玩。结果我摆出了几个以前开发过的小系统&#xff0c;准备在这段时间带着小阿巴多做些作品&#xff0c;学习编程…

每日一笑 | 在托运行李时,怎样才能不会因为超重被罚钱?

全世界只有3.14 % 的人关注了数据与算法之美&#xff08;图片来源于网络&#xff0c;侵权删&#xff09;

加时间水印_如何在手机照片上添加时间和日期?打开这个设置即可添加,超方便...

经常在朋友圈或者微博刷到一些照片&#xff0c;上面带有拍照时间和地点&#xff0c;甚至是天气&#xff0c;很多人还不知道是怎么操作的吗&#xff0c;今天小编就来告诉大家怎么操作&#xff0c;1分钟包学包会&#xff01;1、照片添加文字、地址、天气打开手机相机&#xff0c;…

少儿编程教育是“揠苗助长”还是要培养未来的程序员?

▲数据汪特别推荐点击上图进入玩酷屋去年有一款名叫CoderMindz的棋类游戏在硅谷名声大噪&#xff0c;它的前身CoderBunnyz发布不到一年时间&#xff0c;销量超过1000余套&#xff0c;销售额以超35000美元&#xff0c;因此大家对新款CoderMindz充满期待。而这款游戏的开发者&…

日志ILog(文件日志/控制台日志/控件日志/网络日志)

日志组件是NewLife系列组件最早最基础&#xff0c;同时也是流血流泪最多的一个模块&#xff0c;它的底蕴定能感动每一个用户&#xff01;没有日志的应用系统是不完整的。系统遇到啥问题&#xff0c;翻日志看看当时上下文&#xff0c;实在分析不出问题&#xff0c;修改代码再打几…

php crypt mysql password_php使用crypt()函数进行加密

一、代码$str 应用crypt()函数进行单向加密!; //声明字符串变量$strecho 加密前$str的值为&#xff1a;.$str;$crypttostr crypt($str); //对变量$str加密echo 加密后$str的值为&#xff1a;.$crypttostr; //输出加密后的变量?>二、运行结果参数不带salt&#xff0c;每次…

.NET 容器环境下创建应用 dump 文件

.NET 容器环境下创建应用 dump 文件Intro有时候我们的应用会出现一些异常的情况&#xff0c;比如内存飙升&#xff0c;线程死锁等等&#xff0c;通过一些 metrics 我们可能大概的了解内存是增长了&#xff0c;但是具体是哪里增长了&#xff0c;单单看内存的变化很难看出来哪里导…

安装mysql二进制文件_MySQL二进制文件规范安装

演示环境介绍操作系统&#xff1a;CentOS 6.7 (64位)二进制包&#xff1a;MySQL-5.6.30-linux-glibc2.5-x86_64.tar.gzMySQL 下载地址&#xff1a;http://dev.mysql.com/downloads/1、下载MySQL# mkdir /root/mysql# cd /root/mysql# wget http://dev.mysql.com/get/Downloads…

清华体质优良可降5分录取;窃取密钥者奖百万;阿里投入1亿保护方言;腾讯不正当竞争被罚;这就是今天的大新闻...

今天是3月21日农历二月十五今天星期四网络突然变得特别的卡严重影响到我的激情下面是今天的大新闻清华体质优良可再降5分录取&#xff08;中国新闻网&#xff09;据清华大学招生办公室官方微信消息&#xff0c;2019年清华大学将继续在自主招生中开展体质测试。体质测试成绩优良…

[Android]关于IntentService

2019独角兽企业重金招聘Python工程师标准>>> IntentService其实是Service加Handler的组合&#xff0c;Handler存在于专门的HandlerThread上&#xff0c; 区别于UI thread, Service每通过onStart()收到Intent&#xff0c;则转给Handler,通过handleMessage()的方式一个…

Facebook 竟然把服务 27 亿人的 AI 硬件系统开源了?!

全世界只有3.14 % 的人关注了数据与算法之美一直以来&#xff0c;社区对 Facebook 的硬件研究比较关注。在今日的开放计算项目全球峰会上&#xff0c;Facebook 技术策略主管 Vijay Rao 开源了全新的 AI 硬件&#xff1a;面向 AI 训练与推理的硬件系统 Zion 与 Kings Canyon&…

一秒创建高级查询服务

在业务开发中&#xff0c;一个常用的功能就是“高级查询”&#xff0c;就是客户可以根据自己的需要设置查询条件查找数据&#xff0c;类似下图&#xff1a; 通常&#xff0c;我们需要为每个“高级查询”定制Dto类&#xff0c;用于传输条件&#xff0c;并要根据条件组合成查询语…

首款产后抑郁药问世;京东推出城市操作系统;阿里将推出全新销售平台;香港政府砸5300亿填海;脸书再爆隐私丑闻;这就是今天的大新闻...

今天是3月22日农历二月十六今天星期五一周就这么过去了周末得好好耍下面是今天的大新闻首款产后抑郁药问世&#xff08;红星新闻&#xff09;据美国CNN新闻3月19日报道&#xff0c;当地时间本周二&#xff08;19日&#xff09;&#xff0c;美国食品和药物管理局&#xff08;FDA…

navicat如何连接腾讯mysql_使用Navicat连接腾讯云Mysql数据库

1、安装# 安装mysql服务sudo apt-get install mysql-server# 安装客户端sudo apt install mysql-client# 安装依赖sudo apt install libmysqlclient-dev# 检查状态sudo netstat -tap | grep mysql2、设置密码root> mysqlmysql> update mysql.user set authentication_str…