第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提交记录截图

原文地址:https://www.cnblogs.com/huangqingqing/p/8994534.html

时间: 2024-08-30 06:19:47

第04次作业-树的相关文章

2018.02.04(补作业系列)

2018.02.04 补作业系列 1.合并石子 思路: 核心代码: 状态转移方程&解析:s[i]表示前i堆石子的数量总和,f[i][j]表示把第i堆石子到第j堆石子合并成一堆的最优值. 1 for ( i = n-1 ; i >= 1 ; i-- ){ 2 for ( j = i+1 ; j <= n ; j++ ){ 3 for ( k = i ; k <= j-1 ; k++ ){ 4 f[i][j] = min ( f[i][j] , f[i][k] + f[k+1][j]

作业-树状结构设计

作业:树状结构的设计在同一个类中使用OneToMany和ManyToOne 首先想数据库的模型,再想面向对象的模型,然后再来想怎么去做映射,做完映射在想怎么去做CRUD. 1.首先设计数据库的模型应该是Id.parent_Id.单一父亲,好多孩子这就是一棵树. 数据库首先存在的属性有:Id<int> parent_Id<int> name<String> 例子:ID   Parent_ID   公司1       null     分公司12       1      

第四次作业 树

1.2 树结构学习体会 难,不是我等凡夫俗子可以学会的. 困难点:对递归的理解不够透彻,一直转不过来. 解决办法:多看点代码. 2.PTA实验作业 题目一:6-4 jmu-ds-表达式树(25 分) 题目: 输入一行中缀表达式,转换一颗二叉表达式树,并求解. 表达式只包含+,-,*,/,(,)运算符,操作数只有一位,且为整数(有兴趣同学可以考虑负数小数,两位数做法).按照先括号,再乘除,后加减的规则构造二叉树. 如图所示是"1+(2+3)*2-4/5"代数表达式对应二叉树,用对应的二叉

作业 树和森林 遍历(递归/非递归先序,递归/非递归后序,递归层次)

1 #include <iostream> 2 #include"queue.h"//之前写的类 3 #include"stack.h" //之前写的类 4 using namespace std; 5 6 template <class T> 7 class Tree; 8 9 //======================================== 10 // 树节点类声明 11 template <class T>

[TS-A1505] [清橙2013中国国家集训队第二次作业] 树 [可持久化线段树,求树上路径第k大]

按Dfs序逐个插入点,建立可持久化线段树,每次查询即可,具体详见代码. 不知道为什么,代码慢的要死,, #include <iostream> #include <algorithm> #include <cstdio> #include <cstdlib> #include <cstring> #include <cmath> #include <ctime> #include <vector> using

[TS-A1486][2013中国国家集训队第二次作业]树[树的重心,点分治]

首先考虑暴力,可以枚举每两个点求lca进行计算,复杂度O(n^3logn),再考虑如果枚举每个点作为lca去枚举这个点的子树中的点复杂度会大幅下降,如果我们将每个点递归考虑,每次计算过这个点就把这个点删掉,那么如果每次删掉的点是当前子树的重心,枚举点对的复杂度就只有O(logn),对于每次查询答案在trie树中找到时间复杂度基本可视为O(1),最后在分治同时考虑“关键点”即可.总复杂度O(nlogn). 1 #include <iostream> 2 #include <algorith

BZOJ3236: [Ahoi2013]作业 树状数组维护 莫队

水果~~~~ 关于四个while可行性的证明:区间有正确性所以不管那团小东西用没有duang~反它最终总会由于两次覆盖二准确 关于区间种数可行性的证明:他会在0 1间(或两边)来回跳动(过程中),最终会停在一个大于等于0的地方由于多次覆盖,最终也会趋于准确 #include<iostream> #include<cstdlib> #include<cstdio> #include<cmath> #include<algorithm> #defin

第四次作业——04树

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

[转载]树、森林和二叉树的转换

本文转载自:http://www.cnblogs.com/zhuyf87/archive/2012/11/04/2753950.html 树转换为二叉树 (1)加线.在所有兄弟结点之间加一条连线. (2)去线.树中的每个结点,只保留它与第一个孩子结点的连线,删除它与其它孩子结点之间的连线. (3)层次调整.以树的根节点为轴心,将整棵树顺时针旋转一定角度,使之结构层次分明.(注意第一个孩子是结点的左孩子,兄弟转换过来的孩子是结点的右孩子) 森林转换为二叉树 (1)把每棵树转换为二叉树. (2)第一