• 博客作业04--树


    1.学习总结(2分)

    1.1树结构思维导图

    1.2 树结构学习体会

    • 树的代码实现中大量使用到递归法,但是递归法我使用起来不是很灵活,因此做题的时候不顺畅。
    • 树和二叉树的性质不熟悉,计算易错。
    • 朋友圈、亲戚关系类型题目不能实现、并查集不会用。

    2.PTA实验作业(4分)

    2.1 题目1:jmu-ds-表达式树

    输入一行中缀表达式,转换一颗二叉表达式树,并求解.
    表达式只包含+,-,*,/,(,)运算符,操作数只有一位,且为整数(有兴趣同学可以考虑负数小数,两位数做法)。按照先括号,再乘除,后加减的规则构造二叉树。

    2.2 设计思路(伪代码或流程图)

    void InitExpTree(BTree &T,string str) { //建二叉表达式树
    	初始化运算符栈op,数字字符栈num;
    	将'#'进栈; 
    	while(字符串不空){
    		if(str[i]不为运算符) 
    			建立新节点T赋值为str[i]并进栈num ,将左右孩子置为空 
    		else 
    			switch(Precede(op栈顶运算符,str[i])){
    				case '<':  将str[i]进栈,从str读取下一个字符;   break;
    				case '=':  退栈,从str读取下一个字符;   break;
    				case '>':  op栈顶运算符赋值给新节点T并出栈,num栈顶元素分别赋值给左右孩子,将T进栈num;   break;
    			}	 
    	end
    	while(op栈顶运算符不为 # )
    		op栈顶运算符赋值给新节点T并出栈,num栈顶元素分别赋值给左右孩子,将T进栈num 
    	end 
    
    double EvaluateExTree(BTree T){//计算表达式树 
    	定义浮点型变量a,b;
    	利用递归把所有字符转换成数字;
    	switch(T节点不空){
    		case '+':  返回 a+b;  break;
    		case '-':  返回 a-b;  break;
    		case '*':  返回 a*b;  break;
    		case '/':  if (b为0)   输出"divide 0 error!";退出; 
    			      返回 a/b;  break; 
    	}
    }
    
    

    2.3 代码截图

    2.4 PTA提交列表说明。

    • 编译错误:多放了题目已给的函数进去
      解决方法:删除多余函数

    • 答案错误:输出的结果不对

      解决方法①:检查发现把字符转数字一步出错,修改后输出的答案正确,但PTA还是不能通过

      修改后:
      解决方法②:经同学帮助找出错误,num的栈顶元素赋值给左右孩子使错误,应该先赋值给右孩子,再赋值给左孩子,否则会使a,b值反掉,使计算错误

      解决方法③:如遇到除0,提示divide 0 error!这一点没进行判断,除0时答案错误

    2.1 题目2:jmu-ds-二叉树叶子结点带权路径长度和

    二叉树叶子结点的带权路径长度指:叶子结点的权重路径长度。本题要求算出二叉树所有叶子结点的带权路径长度和。

    2.2 设计思路(伪代码或流程图)

    BinTree CreateBtree(string str,int i){ //创建树
    	定义len存放字符串长度 
    	当节点不存在时,返回NULL;
            建立新节点b,将str[i]的值赋予bt;
            求出该节点所在高度 
            递归创建左子树; 
    	递归创建右子树;
    	返回根节点 
    } 
    void wpl(BinTree b){//求wpl 
    	if 树为空  退出; 
    	if 树不为空
    		if b的左孩子节点不为空或  b的右孩子节点不为空
    	        递归遍历找出叶子节点,累加其wpl值;
    } 
    

    2.3 代码截图

    2.4 PTA提交列表说明。

    • 答案错误:求wpl的值处错误
      解决方法:修改sum累加的式子

    • 一个在写代码时遇到的问题

    • 问题:求某节点所处高度,不会求
      解决方法:求助同学了解为:b->H=log(i)/log(2)+1;

    2.1 题目3:修理牧场

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

    2.2 设计思路(伪代码或流程图)

    PtrH create(ElemType arr[],int n){//创建哈夫曼树
    	定义ptrArr[n],
    	定义ptr,p;
    	初始化p;
    	将数组arr[]中的数存入ptr树,并初始化根ptr左右子树为空;
    	 for  i=1  to  n  
    	 	定义k1=-1,k2 表示数组中最小和次小的数
    		for  j=0 to n  
    			if (ptrArr[j]不空且k1为-1)  k1=j; continue;
    			if (ptrArr[j]不空)  k2=j;  break; 
    		end 
    
    		for  j=k2 to n  
    	 	    if (ptrArr[j]不空)
    		      将数组中最小值赋值给下标为k1的,次小值赋值给下标为k2的	       
                     end
    
    	        建立一棵新树p指向树根结点,根的值是两子树相加
    	        最小权值作为p的左子树;
                    次小权值作为p的右子树;; 
                    将指向新树的指针赋给ptrArr指针数组中k1位置;
    	        k2位置则空; 
    	end 
    	return p; 
    } 
    

    2.3 代码截图

    2.4 PTA提交列表说明。

    • 问题:本题其实就是用题目给的数据创建一棵哈夫曼树,求其wpl值,我的主要问题在创建哈夫曼树的问题上。
      解决方法:创建哈夫曼树的方法自己写不出来,最终通过百度找了方法

    • 问题:对于课本上哈夫曼树的构造中min1=min2=32767;一直不知道是什么意思,最后查资料知道

    3.截图本周题目集的PTA最后排名(3分)

    3.1 PTA排名

    3.2 我的得分:205(2分)

    4. 阅读代码(必做,1分)

    5. 代码Git提交记录截图

  • 相关阅读:
    elasticsearch文档
    swagger 接口文档
    IOS Pod install 443
    Celery 中文文档
    orm 不设置外建进行跨表查询
    There is no current event loop in thread
    django 中文文档
    MJRefresh 下拉刷新 上拉加载
    beeline导出hive数据
    什么是数据湖_二(转载)
  • 原文地址:https://www.cnblogs.com/smtwula/p/8995161.html
Copyright © 2020-2023  润新知