第四次作业 树

1.2 树结构学习体会

难,不是我等凡夫俗子可以学会的。

困难点:对递归的理解不够透彻,一直转不过来。

解决办法:多看点代码。

2.PTA实验作业

题目一:6-4 jmu-ds-表达式树(25 分)

题目:

  • 输入一行中缀表达式,转换一颗二叉表达式树,并求解.
  • 表达式只包含+-*/运算符,操作数只有一位,且为整数(有兴趣同学可以考虑负数小数,两位数做法)。按照先括号,再乘除,后加减的规则构造二叉树。
  • 如图所示是"1+(2+3)*2-4/5"代数表达式对应二叉树,用对应的二叉树计算表达式的值。 转换二叉树如下:

思路:

建立表达式二叉树

定义栈 s 用来存储用运算的数字

定义字符栈 o p 用来存储数字运算符号

首先 将’#‘ 如栈op

当str不为空的时候 进行while

if 是数字

就建立一个树节点,将它赋值为str{i}的值,还要就左右孩子弄成NULL,  还要入栈

else 调动Precede

对它出现的运算符一一进行运作,

用swich

while  op的top不是#

创建新的树节点

赋予为op.top的值

在将栈里的后面两个值分别给左右孩子

/*计算表达式树*/

利用递归把所有字符转换成数字

while 若有树节点

就计算

4.PTA提交列表说明

题目二:6-1 jmu-ds-二叉树操作集(20 分)

本题要求用层次法创建二叉树,层次法输入序列是按树的从上到下从左到右的顺序形成,各层的空节点用字符 #表示

2.设计思路:

根据层次字符序列创建二叉树

定义一个队列q;

一个树 temp

if str是#

就直接ruturn

else 建立一个树节点

左右孩子为NULL;

将str【i】赋值给它

就节点入队列

while !队列

出队列

分别判断字符串后两个是否为空

不是空:建立新节点,赋值

6-3 先序输出叶结点(15 分)

本题要求按照先序遍历的顺序输出给定二叉树的叶结点。

2.设计思路:

if !BT 结束

当左右孩子多NULL时

就输出节点

总分

185

也就是2分

4.阅读代码

  1. //huffmanCoding.c
  2. #include <stdio.h>
  3. #include <limits.h>
  4. #include <string.h>
  5. #include <stdlib.h>
  6. #define N 6
  7. typedef struct huffNode
  8. {
  9. unsigned int weight;   //权重
  10. unsigned int lchild,rchild,parent;  //左右子节点和父节点
  11. }HTNode,*HuffTree;
  12. typedef char **HuffCode;
  13. //找出数组中无父节点且权值最小的两个节点下标,分别用s1和s2保存
  14. void select(const HuffTree &HT,int n,int &s1,int &s2);
  15. //HT:哈夫曼树,HC:哈夫曼编码,w:构造哈夫曼树节点的权值,n:构造哈夫曼树节点的个数
  16. void HuffmanCode(HuffTree &HT,HuffCode &HC,int *w,int n);
  17. int main()
  18. {
  19. int i;
  20. char key[N] = {‘0‘,‘A‘,‘B‘,‘C‘,‘D‘,‘E‘};//第0个元素保留不用
  21. int w[N] = {0,1,2,4,5,6}; //第0个元素保留不用
  22. HuffTree HT;
  23. HuffCode HC;
  24. HuffmanCode(HT,HC,w,N - 1);
  25. for ( i = 1; i < N; i++ )
  26. printf("%c:%s\n",key[i],HC[i]);
  27. printf("\n");
  28. return 0;
  29. }
  30. //找出数组中权值最小的两个节点下标,分别用s1和s2保存
  31. void select(const HuffTree &HT,int n,int &s1,int &s2)
  32. {
  33. int i;
  34. s1 = s2 = 0;
  35. int min1 = INT_MAX;//最小值,INT_MAX在<limits.h>中定义的
  36. int min2 = INT_MAX;//次小值
  37. for ( i = 1; i <= n; ++i )
  38. {
  39. if ( HT[i].parent == 0 )
  40. {//筛选没有父节点的最小和次小权值下标
  41. if ( HT[i].weight < min1 )
  42. {//如果比最小值小
  43. min2 = min1;
  44. s2 = s1;
  45. min1 = HT[i].weight;
  46. s1 = i;
  47. }
  48. else if ( (HT[i].weight >= min1) && (HT[i].weight < min2) )
  49. {//如果大于等于最小值,且小于次小值
  50. min2 = HT[i].weight;
  51. s2 = i;
  52. }
  53. else
  54. {//如果大于次小值,则什么都不做
  55. ;
  56. }
  57. }
  58. }
  59. }
  60. //HT:哈夫曼树,HC:哈夫曼编码,w:构造哈夫曼树节点的权值,n:构造哈夫曼树节点的个数
  61. void HuffmanCode(HuffTree &HT,HuffCode &HC,int *w,int n)
  62. {
  63. int s1;
  64. int s2;
  65. int m = 2 * n - 1;       //容易知道n个节点构造的哈夫曼树是2n-1个节点
  66. int i,c,f,j;
  67. char *code;  //暂存编码的
  68. HT = (HuffTree)malloc((m+1)*sizeof(HTNode));  //0单元未使用
  69. for ( i = 1; i <= n; i++ )
  70. HT[i] = {w[i],0,0,0};//初始化前n个节点(构造哈夫曼树的原始节点)
  71. for ( i = n + 1; i <= m; i++ )
  72. HT[i] = {0,0,0,0};  //初始化后n-1个节点
  73. //构建哈夫曼树
  74. for ( i = n + 1; i <= m; i++)
  75. {
  76. select(HT,i-1,s1,s2);//找出前i-1个节点中权值最小的节点下标
  77. HT[s1].parent = i;
  78. HT[s2].parent = i;
  79. HT[i].lchild = s1;
  80. HT[i].rchild = s2;
  81. HT[i].weight = HT[s1].weight + HT[s2].weight;
  82. }
  83. //哈夫曼编码
  84. HC = (char **)malloc((n)*sizeof(char *));
  85. //暂存编码
  86. code = (char *)malloc(n*sizeof(char));//使用了第0单元
  87. for ( i = 1; i <= n; i++ )
  88. {
  89. for ( c = i, f = HT[c].parent, j = 0; f != 0; c = HT[c].parent, f = HT[c].parent,  j++ )
  90. {//从叶子扫描到根
  91. if ( HT[f].lchild == c )
  92. {
  93. code[j] = ‘0‘;
  94. }
  95. else if(HT[f].rchild == c)
  96. {
  97. code[j] = ‘1‘;
  98. }
  99. else
  100. {//否则什么也不做
  101. ;
  102. }
  103. }
  104. code[j] = ‘\0‘;
  105. HC[i] = (char *)malloc(strlen(code)*sizeof(char));
  106. strcpy(HC[i],code);
  107. }
  108. }

原文地址:https://www.cnblogs.com/88888a/p/8995558.html

时间: 2024-08-06 18:05:18

第四次作业 树的相关文章

第四次作业——04树

第四次作业--树 一.学习总结 树的思维结构图 2.对于树学习总结 ⑴.树结构认识:树是一种非线性结构,每个节点有0个或多个后继节点,有且仅有一个前驱节点(根节点除外).在树中,递归方法可以放在考虑的首要位置 ⑵.学习这个结构遇到的困难:递归调用不会很清晰,代码量大,较难记忆. ⑶.树结构可以解决的问题:并查集问题 哈夫曼编码的问题. 二.6-1 二叉树操作集 1.设计思路 void CreateBTree(BTree &BT,string str){ 创建一个树T 定义一个i来计数 创建一个队

04+罗潇潇+罗潇第四次作业

04+罗潇潇+罗潇第四次作业 1.项目整体管理的过程 (1)项目启动,制定章程 (2)制定初步的项目范围说明书. (3)制定项目管理计划 (4)指导和管理项目执行 (5)监督和控制项目 (6)整体变更 (7)项目收尾 2.项目启动就是以书面的.正式的形式肯定项目的成立与存在,同时以书面正式的形式为项目经理进行授权.项目章程应当由项目组织以外的项目发起人发布,若项目为本组织开发也可以由投资人发布. 3.项目章程包括: (1)基于项目干系人的需求和期望提出的要求. (2)项目必须满足的业务要求和产品

软件工程(第四次作业)

第四次作业 题目: 1. 敏捷开发是在什么样的背景下产生的?其主要特点有哪些?什么时候选择敏捷开发更恰当,为什么? 2. Code smell 是如何产生的?有哪些典型的 code smell?代码重构(Code refactoring)有哪些优点?有哪些代码重构的方法? 答:1(1)敏捷开发的背景: 所谓敏捷开发是以用户的需求进化为核心,采用迭代.循序渐进的方法进行软件开发.在敏捷开发中,软件项目在构建初期被切分成多个子项目,各个子项目的成果都经过测试,具备可视.可集成和可运行使用的特征.换言

软件工程第四次作业——团队作业

软件工程第四次作业--团队作业 本次作业采用团队作业的方式,我的队友是我的同班同学,他们分别为:(队长)亢健强,贾猛,黄明帅,黄珂锐.我们团队的总体任务是要做一个"乐谱识别与演奏"的软件,拍摄一张乐谱图片,它会使用光学识别转换成音乐. 此次团队作业中我得任务主要是做需求调研,为此我先总结了一下常用的需求调研方法的优缺点,然后结合我们团队的实际情况选出了一种最适合我们的调研方法. 调研方法 优 点 缺 点 实地观察法 调查者在实地通过观察获得直接的.真实可靠的第一手资料 有一定的偶然性,

&lt;第四次作业查阅&gt;hashmap由value找key的算法

问题:不同于第三次作业,第三次作业是按照key的值排序输出,第四次作业则是要求按照频率(hashmap的value值)排序,然后输出key的值,最开始的想法是还是沿用第三次作业的做法,想着查询一下怎么从value反得到key的值,最后发现这种做法不仅麻烦,而且效率特别低,也给了我启示,由于key-value对可能出现多对一的情况,所以由key的value比较容易高效,但是反之的效率就比较低,应该尽量能够避免试图通过value得key. Map中是一个key有且只有一个value. 但是一个val

6天通吃树结构—— 第四天 伸展树

原文:6天通吃树结构-- 第四天 伸展树 我们知道AVL树为了保持严格的平衡,所以在数据插入上会呈现过多的旋转,影响了插入和删除的性能,此时AVL的一个变种 伸展树(Splay)就应运而生了,我们知道万事万物都遵循一个“八二原则“,也就是说80%的人只会用到20%的数据,比如说我们 的“QQ输入法”,平常打的字也就那么多,或许还没有20%呢. 一:伸展树 1:思想 伸展树的原理就是这样的一个”八二原则”,比如我要查询树中的“节点7”,如果我们是AVL的思路,每次都查询“节点7”,那么当这 棵树中

结对作业(软件工程第四次作业)

软件工程第四次作业---代码审查 一.partner 结对伙伴:林路 代码链接:coding 二.代码审查表 功能模块名称 简单的语法分析程序 审查人 王灵杰 审查日期 2018.4.6 代码名称 简单的语法分析程序 代码作者 林路 文件结构 重要性 审查项 结论 头文件和定义文件的名称是否合理? 合理 头文件和定义文件的目录结构是否合理? 合理 版权和版本声明是否完整? 不完整 重要 头文件是否使用了 ifndef/define/endif 预处理块? 没有 头文件中是否只存放"声明"

第04次作业-树

第04次作业-树 1.学习总结 1.1树结构思维导图 1.2 树结构学习体会 树的结构是一种非线性结构,一对多,定义也是递归的,有一个根结点和任意个子树. 我的学习体会:我觉得树相比之前的一对一的线性结构来说,难度增大了很多,树的实现又会借用到之前学的栈啊,队列啊,就像是之前所学的大杂烩,并且会用上递归,虽然递归可读性很好,但是想出怎么写也是很难,看懂容易,自己写递归不容易. 树可以应用在查找,如二叉搜索树,用在求类似最优路径的问题,如哈夫曼树,应用在做计算表达式,把表达式转化成树,再求值,能算

第四次作业总结与心得

一. 知识点总结:1.char 字符类型的定义 2.输入getchar,输出putchar 3.逻辑运算:逻辑与&&,逻辑或||,逻辑非| 4.两类分支结构:二分支结构,多分支结构 5.条件语句:if语句,switch语句 二.实验过程中遇到的问题及解决方法: 1.在使用switch语句时忘记使用break语句,应该在switch语句的每个语句段中都使用break语句 2.注意if与else的对应关系,else总是与它上面最近的if配对,若if与else的数目不一致,可以加{}来确定配对关