一、学习总结

1、树结构思维导图

2、树结构学习体会

  • 树这一节遇到最大的困难就是递归不能灵活的运用,总是想用链表那里的知识解决,做了一大堆,程序崩溃也找不到问题出在哪里。

二、PTA实验作业

题目1:表达式树

1、设计思路

void InitExpTree(BTree &T,string str)
{
定义i做下标
定义栈s用于存放树的节点数据
定义字符栈p用来存放符号
入栈#用作空栈标识 while (str[i])
{
判断str[i]不是字符
{
创建树T并申请空间
将str中的数据赋给树T
左右子树初始化
T中数据入栈s
}
否则
{
switch判断字符
{
"<"时
数据入栈p
i++;
break;
"="时
p栈顶元素出栈;
i++;
break;
">"时
创建新节点T
将p栈顶元素赋给T
p栈顶元素出栈
将s的栈顶元素赋给T的右孩子
s栈顶元素出栈
if(s不为空)
{
将s栈顶元素赋给左孩子
s栈顶元素出栈
}
T元素入栈s
break;
}
}
}
while p栈顶元素不为'#'
{
创建新节点T
将p栈顶元素赋给T
p栈顶元素出栈
将s的栈顶元素赋给T的右孩子
s栈顶元素出栈
if(s不为空)
{
将s栈顶元素赋给左孩子
s栈顶元素出栈
}
T元素入栈s
}
double EvaluateExTree(BTree T)
{
定义a b两个运算变量
判断T的左右孩子都不存在
返回 T->data-'0';
a=EvaluateExTree(T->lchild);
b=EvaluateExTree(T->rchild);
switch T此时的元素
{
'+'时
返回a+b;
break;
'-'时
返回a-b;
break;
'*'时
返回a*b;
break;
'/'时
if(b==0)
打印"divide 0 error!"
否则返回a/b;
break;
}
}

2、代码截图

3、PTA提交列表说明

4、调试问题

- 段错误:在将栈s创建进树中是缺少情况建立左子树。添加当s不为空是,将s的栈顶元素赋给T的左子树

题目2:修理牧场

农夫要修理牧场的一段栅栏,他测量了栅栏,发现需要N块木头,每块木头长度为整数Li个长度单位,于是他购买了一条很长的、能锯成N块的木头,即该木头的长度是L​i​​ 的总和。但是农夫自己没有锯子,请人锯木的酬金跟这段木头的长度成正比。为简单起见,不妨就设酬金等于所锯木头的长度。例如,要将长度为20的木头锯成长度为8、7和5的三段,第一次锯木头花费20,将木头锯成12和8;第二次锯木头花费12,将长度为12的木头锯成7和5,总花费为32。如果第一次将木头锯成15和5,则第二次锯木头花费15,总花费为35(大于32)。

1、代码截图

2、PTA提交列表说明

3、调试问题

- 哈夫曼树建不出来:这道题明显是用哈夫曼树,编写了很久但一直不能用树的结构写出来。最后用了链表做了出来。遇到的问题不算大。但是还是很可惜

- 编译错误 :在释放链表结点时,c++该用delete,我用了free

- 其他问题会在阅读代码那边详细讲

题目3:求二叉树高度

1、设计思路

定义左子树高度、右子树高度变量

递归调用算左子树、右子树高度
返回左右子树高度最大值加一

2、代码截图

3、PTA提交列表说明

4、调试问题

- 思路错误:第一次做的时候,并没有想到用递归做,后来看了陈越版的课本才会用了递归

三、截图本周题目集的PTA最后排名

1、PTA排名

2、我的得分

2.5分

四、 阅读代码

修理牧场优秀代码

1、代码

---------------------------------优先队列做法-------------------------------
#include <cstdio>
#include <queue> using namespace std; priority_queue<int, vector<int>, greater<int> > q; int main() {
int n, m; scanf( "%d", &n ); for( int i = 0; i < n; i++ ) {
scanf( "%d", &m );
q.push( m );
} int sum = 0; while( q.size() > 1 ) {
int first = q.top();
q.pop(); int second = q.top();
q.pop(); sum += first + second;
q.push( first + second );
} printf( "%d\n", sum ); return 0;
} --------------------------数组做法---------------------------
# include <stdio.h>
# include <malloc.h> int main ()
{
int i, m, num, t;
int val;
int cost=0; scanf ("%d", &num);
int *a=(int*)malloc(sizeof(int)*num); for (i=0;i<num;i++)
scanf ("%d", &a[i]);
while (i!=1)
{
m=i-1;
for (int j=0;j<i;j++)
for (int k=0;k<i; k++)
if (a[j]>a[k])
{
t=a[j];
a[j]=a[k];
a[k]=t;
}
//for (int z=0;z<i;z++)
// printf("%d ",a[z]);
//printf ("\n");
a[m-1]=a[m-1]+a[m];
cost=cost+a[m-1];
//printf("%d\n",a[m]);
i--;
}
printf ("%d\n", cost);
return 0;
}

学习内容:

优先队列:它的“优先”意指取队首元素时,有一定的选择性,即根据元素的属性选择某一项值最优的出队~

百度百科上这样描述的:

  优先级队列 是不同于先进先出队列的另一种队列。每次从队列中取出的是具有最高优先权的元素

  优先队列的类定义  

  优先队列是0个或多个元素的集合,每个元素都有一个优先权或值,对优先队列执行的操作有: 查找; 插入一个新元素; 删除.

在最小优先队列(min priorityq u e u e)中,查找操作用来搜索优先权最小的元素,删除操作用来删除该元素;对于最大优先队列(max priority queue),查找操作用来搜索优先权最大的元素,删除操作用来删除该元素.优先权队列中的元素可以有相同的优先权,查找与删除操作可根据任意优先权进行.

给出一行字符串,求出其原编码需要的编码长度和哈夫曼编码所需的长度,并求其比值

分析:根据哈夫曼生成树的生成过程可知,其生成树的权值是固定的而且这个值是最小的,而且其值根据生成树的顺序,我们可以找出规律而

不需要真的去生成一棵树然后再求出权值,其模拟过程为取出队列中权值最小的两个元素,将其值加入结果中,然后将这两个元素的权值求和

即得出其父节点的权值,将生成元素作为结点入队~~如此循环,直至取出队列中最后两个元素加入结果,实现代码如下:

#include<stdio.h>
#include<string.h>
#include<ctype.h>
#include<functional>
#include<queue>
using namespace std;
#define M 1000050
char str[M];
int list[27];
priority_queue< int,vector<int>,greater<int> >que;
int main()
{
int ans,sum;
int i,a,b,c;
while(scanf("%s",str),strcmp(str,"END")){
memset(list,0,sizeof(list));
for(i=0;str[i];i++){
if(isalpha(str[i]))
list[str[i]-'A']++;
else
list[26]++;
}
sum=i*8;ans=i;c=0;
for(i=0;i<27;i++){
if(list[i]){
que.push(list[i]);
c++;
}
}
if(c>1){ans=0;//注意只有一种字符的情况
while(que.size()!=1){
a=que.top();
que.pop();
b=que.top();
que.pop();
ans+=a+b;
que.push(a+b);
}
while(!que.empty())//使用后清空队列
que.pop();
}
printf("%d %d %.1f\n",sum,ans,1.0*sum/ans);
}
return 0;
}

五、代码Git提交记录截图

DS04--树的更多相关文章

  1. B树——算法导论(25)

    B树 1. 简介 在之前我们学习了红黑树,今天再学习一种树--B树.它与红黑树有许多类似的地方,比如都是平衡搜索树,但它们在功能和结构上却有较大的差别. 从功能上看,B树是为磁盘或其他存储设备设计的, ...

  2. ASP.NET Aries 入门开发教程8:树型列表及自定义右键菜单

    前言: 前面几篇重点都在讲普通列表的相关操作. 本篇主要讲树型列表的操作. 框架在设计时,已经把树型列表和普通列表全面统一了操作,用法几乎是一致的. 下面介绍一些差距化的内容: 1:树型列表绑定: v ...

  3. 再讲IQueryable<T>,揭开表达式树的神秘面纱

    接上篇<先说IEnumerable,我们每天用的foreach你真的懂它吗?> 最近园子里定制自己的orm那是一个风生水起,感觉不整个自己的orm都不好意思继续混博客园了(开个玩笑).那么 ...

  4. HDU1671——前缀树的一点感触

    题目http://acm.hdu.edu.cn/showproblem.php?pid=1671 题目本身不难,一棵前缀树OK,但是前两次提交都没有成功. 第一次Memory Limit Exceed ...

  5. 算法与数据结构(十一) 平衡二叉树(AVL树)

    今天的博客是在上一篇博客的基础上进行的延伸.上一篇博客我们主要聊了二叉排序树,详情请戳<二叉排序树的查找.插入与删除>.本篇博客我们就在二叉排序树的基础上来聊聊平衡二叉树,也叫AVL树,A ...

  6. [C#] C# 知识回顾 - 表达式树 Expression Trees

    C# 知识回顾 - 表达式树 Expression Trees 目录 简介 Lambda 表达式创建表达式树 API 创建表达式树 解析表达式树 表达式树的永久性 编译表达式树 执行表达式树 修改表达 ...

  7. bzoj3207--Hash+主席树

    题目大意: 给定一个n个数的序列和m个询问(n,m<=100000)和k,每个询问包含k+2个数字:l,r,b[1],b[2]...b[k],要求输出b[1]~b[k]在[l,r]中是否出现. ...

  8. bzoj1901--树状数组套主席树

    树状数组套主席树模板题... 题目大意: 给定一个含有n个数的序列a[1],a[2],a[3]--a[n],程序必须回答这样的询问:对于给定的i,j,k,在a[i],a[i+1],a[i+2]--a[ ...

  9. bzoj3932--可持久化线段树

    题目大意: 最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分.超级计算机中的 任务用三元组(Si,Ei,Pi)描述,(Si,Ei,Pi)表示任务从第Si秒开始,在第 ...

  10. jquery-treegrid树状表格的使用(.Net平台)

    上一篇介绍了DataTable,这一篇在DT的基础之上再使用jquery的一款插件:treegrid,官网地址:http://maxazan.github.io/jquery-treegrid/ 一. ...

随机推荐

  1. 017——数组(十七) asort ksort rsort arsort krsort

    <?php /** * 数组 asort ksort rsort arsort krsort */ //asort()对数组按值排序,保留键名: /*$arr=array( 'bbs_url'= ...

  2. 016——数组(十六)usort uasort uksort

    <?php /*数组 usort uasort uksort */ //usort()通过自定义函数对数组进行排序,原数组索引不保留 /*$arr = array(5, 3, 7, 6, 4, ...

  3. 【河南省第十一届ACM大学生程序设计竞赛-D】.求XF+闭包

       如何设计一个好的数据库不仅仅是一个理论研究问题,也是一个实际应用问题.在关系数据库中不满足规范化理论的数据库设计会存在冗余.插入异常.删除异常等现象. 设R(U)是一个关系模式,U={ A1,A ...

  4. C# 常用时间戳处理方法

    C# 常用时间戳处理方法 /// <summary> /// 时间戳转为C#格式时间 /// </summary> /// <param name="timeS ...

  5. 内存保护机制及绕过方法——利用Ret2Libc绕过DEP之ZwSetInformationProcess函数

    1.    DEP内存保护机制 1.1   DEP工作原理 分析缓冲区溢出攻击,其根源在于现代计算机对数据和代码没有明确区分这一先天缺陷,就目前来看重新去设计计算机体系结构基本上是不可能的,我们只能靠 ...

  6. codis3.2安装配置中的一些问题

    1.参考文档与参考资料问题 安装codis集群之前,我先在网上找资料,然后又到github的项目官方地址找,不得不说,相关的资料不好找,而且找到之后有些东西说的也不是很清楚.由于codis版本迭代的问 ...

  7. 在头文件中声明class 类 与 include类所在的头文件区别---理解

    在头文件中声明class 类 与 include类所在的头文件的理解: 在头文件中,声明类 它告诉编译器:存在这样的类.而实际的类则可以位于同一个编译单元中,也可以放在其他编译单元中.没有这个类原型, ...

  8. flowable ContentEngine和ContentEngineConfiguration的关系

    一.CommandExecutor ContentEngineConfiguration继承自 AbstractEngineConfiguration. 在 AbstractEngineConfigu ...

  9. Swift 3 点击屏幕任意位置隐藏键盘

    func hideKeyboardWhenTappedAround() { let tap: UITapGestureRecognizer = UITapGestureRecognizer(targe ...

  10. Android 框架学习3:从 EventBus 中学到的精华

    关联文章: EventBus 3.0 的特点与如何使用 源码分析 EventBus 3.0 如何实现事件总线 学习的目的是为了超越,经过前面对 EventBus 3.0 的学习,我们已经对它相当熟悉了 ...