zoukankan      html  css  js  c++  java
  • 第04次作业-树

    1.学习总结

    1.1树结构思维导图

    1.2 树结构学习体会

    对树结构的认识:树的结构是一种非线性结构,数据元素之间是一对多的关系,解决关于树的问题时可以用递归、栈、数组、队列。
    遇到的困难:树的操作不熟练,解决树的问题可以运用递归、栈、数组、队列,解题方式多样,难以运用自如。
    树结构可以解决的问题:哈夫曼编码、家谱处理、表达式处理
    
    

    2.PTA实验作业

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

    1. 设计思路

    构造树
    先序遍历二叉树,若树不为空找到叶子结点(左右子树均为空的结点)
    带权路径长度和=每个叶子((结点深度-1)*权重)之和
    

    2.代码截图


    3. PTA提交列表说明。

    题目2:6-4 jmu-ds-表达式树

    1. 设计思路

    建立表达式二叉树:
    依次判断读入字符串的字符
    若字符为操作数,创建结点并入操作数栈
    若字符为运算符,判断运算符栈栈顶运算符与该运算符优先级
    若该运算符优先级高,该运算符入运算符栈
    若该运算符优先级低,运算符栈顶两个符号出栈并创建结点入栈
    运算符栈栈顶运算符与该运算符优先级相同,栈顶运算符出栈
    取出两个操作数和一个运算符出栈构造结点入栈
    
    计算表达式树:
    若为叶子结点(左右子树均为空),返回结点值
    否则,取操作数和运算符进行计算
    

    2.代码截图



    3. PTA提交列表说明。


    答案错误:除0错误
    原因:计算表达式树函数有返回值,遇到除数为0的情况
    解决方法:将

    case '/':if(right==0)
    			cout<<"divide 0 error!";
    	    else return left/right;
    	}
    

    改为

    case '/':if(right==0){
    			cout<<"divide 0 error!";
    			exit(0);
    		}
    	    return left/right;
    	}
    

    题目3:7-7 修理牧场

    1. 设计思路

    定义a[n]存放长度,sum表示每次锯木头的费用,total表示总费用
    将木块长度存入数组并按从小到大顺序排序
    for i=0 to n-2
        sum=最小两项和
        total+=sum
        将sum插入数组,数组保持从小到大顺序
    end for
    输出总费用
    

    2.代码截图

    3. PTA提交列表说明。


    编译错误:使用C++头文件却用C编译器

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

    3.1 PTA排名截图

    3.2 我的总分:

    1.5分

    4. 阅读代码(必做)

    #include <bits/stdc++.h>
    using namespace std;
    const int N = 1e6 + 3;
    struct node{
        int dad, mom;   
        char sex;       
        node(): dad(-1), mom(-1), sex('M'){} 
    }fam[N];
    bool Find(int a, int b, int cnt)
    {
        if(a == -1 || b == -1) return true;
        if((fam[a].dad != -1 && fam[a].dad == fam[b].dad) || (fam[a].mom != -1 && fam[a].mom == fam[b].mom))
            return false;
        cnt++;
        if(cnt >= 4) return true;
        return(Find(fam[a].dad, fam[b].mom, cnt) && Find(fam[a].mom, fam[b].dad, cnt) && Find(fam[a].dad, fam[b].dad, cnt) && Find(fam[a].mom, fam[b].mom, cnt));
    }
    int main()
    {
        int n, m, id;
        scanf("%d", &n);
        while(n--)
        {
            scanf("%d", &id);
            getchar();
            scanf("%c%d%d", &fam[id].sex, &fam[id].dad, &fam[id].mom);
            if(fam[id].dad != -1)
                fam[fam[id].dad].sex = 'M';
            if(fam[id].mom != -1)
                fam[fam[id].mom].sex = 'F';
        }
        scanf("%d", &m);
        int a, b;
        while(m--)
        {
            scanf("%d%d", &a, &b);
            if(fam[a].sex == fam[b].sex)
                printf("Never Mind
    ");
            else
            {
                if(Find(a, b, 0))
                    printf("Yes
    ");
                else
                    printf("No
    ");
            }
        }
        return 0;
    }
    

    该代码功能:判断两个人最近的共同祖先是否五代以内,能否通婚
    优点:利用递归遍历判断,代码简洁,可读性较强
    代码相关地址:https://blog.csdn.net/jiang_1603/article/details/79731264

    5. 代码Git提交记录截图

  • 相关阅读:
    poj 2411 Mondriaan's Dream 骨牌铺放 状压dp
    zoj 3471 Most Powerful (有向图)最大生成树 状压dp
    poj 2280 Islands and Bridges 哈密尔顿路 状压dp
    hdu 3001 Travelling 经过所有点(最多两次)的最短路径 三进制状压dp
    poj 3311 Hie with the Pie 经过所有点(可重)的最短路径 floyd + 状压dp
    poj 1185 炮兵阵地 状压dp
    poj 3254 Corn Fields 状压dp入门
    loj 6278 6279 数列分块入门 2 3
    VIM记事——大小写转换
    DKIM支持样本上传做检测的网站
  • 原文地址:https://www.cnblogs.com/lanjinghui/p/8995534.html
Copyright © 2011-2022 走看看