第04次作业-树

第04次作业-树


1.学习总结

1.1树结构思维导图

1.2 树结构学习体会

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

2.PTA实验作业

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

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

    void InitExpTree(BTree &T,string str) 
    {
        初始化两个栈s1,s2,分别存操作数和运算符;
        int i=0;BTree s;
        while (i<str.size())
         do
           if(str[i]是操作数)
           then 
               新建节点s,存入操作数,并置左右孩子为空;
               s进栈s1;
        
          else
              then
               if(s2为空)
                then 
                  新建节点s,存入运算符,并置左右孩子为空;
                  进栈s2;
               else
                if(str[i]的优先级大于s2.top())
                 then 
                  新建节点s,存入运算符,并置左右孩子为空;
                  进栈s2;
                else 
                 then 
                 if(str[i]是')')
                    then 
                      while (s2.top()!='(')
                        s2.top()->rchild=s1.top();
                        s1.pop()
                         s2.top()->lchild=s1.top();
                        s1.pop()
                        s2.pop()
                        end while
                 else
                  then 
                   while(s2.top()!='('并且s2.top()优先级小于str[i])
                     重复上面遇到'('的操作,为s2配左右孩子
                  end while
                  end while
     }
double EvaluateExTree(BTree T)
{
   if(T->data为数字字符)
   return T->data-'0';
   if(T为空)return 0;
   else 
    {
    switch(T->data)
    {
    case '+':return 左子树的值+右子树的值;break;
    case '-':return 左子树的值-右子树的值;break;
    case '*':return 左子树的值*右子树的值;break;
    case '/':if(右子树空不为0)
        return 左子树的值/右子树的值;break;
       else 打印除零错误语句
}

2.3 代码截图





2.4 PTA提交列表说明。

除0错误

  • 错误原因
    例如输入1/0
    会出现如下情况

百度之后发现这个nan是not a number 分母为零会产生这次错误

  • 解决方法:询问同学后发现,把return 0转换成exit(0),并添加一个stdlib.h,就不会出现了,exit功能是关闭所有文件,终止正在执行的进程。

有括号表达式

  • 错误原因
    在优先级小于栈顶且不是右括号的时候,出栈应该出到栈顶元素优先级小于str[i],或遇到左括号,才能停止。不能只出一次
  • 解决方法
    增加while语句
 while( s2.size()&&s1.size()&& Precede(s2.top()->data,str[i])=='>'&&s2.top()->data!='(')

2.1题目二 7-7 修理牧场(25 分)

2.2 设计思路(伪代码或流程图)
采用哈夫曼树的思想,每次找出最小的两个

 queue<int>q; 
 cin>>n;
 int min1,min2;
 for i=0 to n-1
   cin>>p,p全部进队q
 while (q.size()-1)
    do
     min1=q.front();q.pop()
     min2=q.front();q.pop()
    
    for i=0 to n-1
     if(队首元素<min1)
      then
       q.push(min2)
       min2的值等于min1
       min1的值为队首元素
       q.pop();
    
   elseif(队首元素<min2)
     then
     q.push(min2)
     min2=队首元素
     q.pop()
     
     else
       q.push(队首);
       q.pop();
    endfor
    
      sum=min1+min2
      q.push(sum)
  end while
      

2.3 代码截图



2.4 PTA提交列表说明

在codeblock测试过提交,一次就过了

2.1题目三 7-8 jmu-ds-二叉树叶子结点带权路径长度和(25 分)

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

int sum  全局变量
btree create(string str ,int i )//顺序转化为二叉链
{
    btree t;
    t=new tnode;
    if(i为负数||i>=str[i]) return NULL//注意>=
     t->data=str[i];
     t->rchild=(str,2*i+1)//下标关系
     t->lchild=(str,2*i)
    return t;
}
void  level(btree t,int h)
{
    if(t为空)
    sum+=0;
    if(t为叶子节点)
    sum+=t->data*h;
    else
    {
     level(t->lchild,h+1)//注意注意,h+1,不是h++!!
     level(t->rchild,h+1)
    }
}

2.3 代码截图



2.4 PTA提交列表说明。

  • 错误原因

咨询同学得到两个测试数据 #1,#1234#56#7###9,这类情况出现问题

看了好几遍发现:( ,在create 函数中对不规范i的判定有问题,因为题目给的输出中第一个一定是#。所以当i>str.size()时,就出错了

  • 解决方法
if(i<=0||i>str.size()) return NULL

改为

if(i<=0||i>=str.size()) return NULL

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

3.1 PTA排名

3.2 我的总分:2分

必做题做完。

4. 阅读代码

代码截图:

代码说明:分别采用递归和非递归的方式来求树的宽度
代码地址 https://www.cnblogs.com/xiaodeyao/p/5064816.html

5. 代码Git提交记录截图

posted on 2018-05-05 17:18  开心仔  阅读(208)  评论(0编辑  收藏  举报

导航