• 博客作业04--树


    博客作业04--树

    1.学习总结(2分)

    1.1树结构思维导图

    1.2 树结构学习体会

    谈谈你对树结构认识,学习这个结构是否遇到哪些困难及树结构可以解决的问题。

    树结构是很实用的一种抽象数据结构,在计算机中应用很广,计算机中的文件存储结构就是一种树的方式,虽然构建起来没有有线性表那样方便,有些构建方式甚至要用到队列或栈来辅助构建,但是有些有点是线性表不具备的,比如查找二叉树的效率比线性查找高的多,很多方面树的应用将使问题解决的效率得到很大提升,比如哈夫曼树就为通讯内容的压缩起到很大帮助。
    困难:树的构建就有很多种方法,以及各种遍历方式,还有递归和非递归的方式,方法太多,所以做的时候很容易混乱,一下子写不出来。
    解决的问题:二叉搜索树,哈夫曼编码,并查集,家谱处理等。

    2.PTA实验作业(4分)

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

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

    void InitExpTree(BTree &T,string str) {
        初始化一个节点栈和一个运算符栈
        遍历字符串
                if(字符是数字)
                        创建一个节点存该字符
                        并把该节点入栈
                else
                        if(运算符栈空)
                                将第一个运算符入栈
                        else
                            比较要入栈的字符与栈顶字符
                            if(比栈顶字符优先级高)
                                入栈
                            else 
                                将栈顶字符出栈到优先级比要入栈字符低或站栈空再入栈,
                                出栈时也要让节点栈出栈两个元素,根据出栈运算符进行
                                运算,结果生成新的节点,将该节点再入栈
        遍历结束后如果运算符栈不空,进行如上出栈操作
        最后树的根节点为节点栈的栈顶元素
    }//建表达式的二叉树
    
    double EvaluateExTree(BTree T){
        建立运算数栈
        定义变量num统计运算结果,n1,n2存从栈中取出的数
        后序遍历树
            if(节点的值是运算数)
                入栈
            else if(节点是操作符)
                出栈两个运算数,根据操作符运算
                结果存到num,num入栈
        遍历结束后返回num
    }//计算表达式树
    
    

    代码截图(注意,截图、截图、截图。代码不要粘贴博客上。不用用···语法去渲染)


    PTA提交列表说明。

    一开始只是简单的按照想法写了出来,提交上去,全部都错误,于是从后面的点往前该,将除0的情况写了出来,用到了exit(0),让程序遇到除0时直接结束。后来修修改改,第二个点也改了出来,因为漏掉了要入栈的字符优先级低时,出栈字符后要将该字符入栈,最后一个点是没有出栈彻底,只出栈一个元素就入栈。

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

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

    void CreateBTree(BTree &BT,string str,int i){
        if(串中i位置的字符为#)
            BT为空节点
        else
            BT申请空间,复制str[i]
            左右孩子为空
            if(2*i+1没超过串的长度,即还有左右孩子)
                递归建BT的左孩子,串中位置2*i
                递归建BT的右孩子,串中位置2*i+1
    }//建树
    
    void getwpl( BTree BT,int &wpl,int h ){
        h第一次调用为0
        if(BT不为空)
            if(BT左右孩子都为空)//叶子节点
                该点h*BT的权值累加到wpl
                h归0
        h++,计算路径长
        if(BT为空)递归出口
        递归调用计算BT左孩子wpl
        递归调用计算BT右孩子wpl
    }//计算wpl
    
    
    

    代码截图(注意,截图、截图、截图。代码不要粘贴博客上。不用用···语法去渲染)

    PTA提交列表说明。

    开始自己有点想法写了一大堆非递归的操作,写到最后没一个点对,该了一下就只有空树时是对的,一下子不知道怎么写,于是就去请教了其他同学,他告诉我可以用递归的方法写一写,于是我自己写了建树的递归方法,代码简洁了很多,最后算wpl的函数是同学给我看了一下,理解后自己写了个差不多的,提交就对了。

    题目3:7-7 修理牧场

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

    优先队列:会在入栈后自动将栈内元素进行排序,值比较大的排在栈底
    建立优先队列
    输入N和M
    for i=0 to n-1
        输入每块木头长,入栈
    定义sum统计最后结果
    while(栈不为空)
        出栈两个元素相加
        结果累加到num
        num入栈
    输出sum
    
    

    代码截图(注意,截图、截图、截图。代码不要粘贴博客上。不用用···语法去渲染)

    PTA提交列表说明。

    先是用课本上哈夫曼树的方法,但是只有前面的两点正确,于是想起了老师说这道题的时间复杂度被严格限定,于是去百度了下优先队列,发现理解后发现这道题很简单。

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

    3.1 PTA排名:4

    3.2 我的得分:230

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

    题目:帅到没朋友
    
    当芸芸众生忙着在朋友圈中发照片的时候,总有一些人因为太帅而没有朋友。本题就要求你找出那些帅到没有朋友的人。
    
    输入格式:
    
    输入第一行给出一个正整数N(<=100),是已知朋友圈的个数;随后N行,每行首先给出一个正整数K(<=1000),为朋友圈中的人数,然后列出一个朋友圈内的所有人——为方便起见,每人对应一个ID号,为5位数字(从00000到99999),ID间以空格分隔;之后给出一个正整数M(<=10000),为待查询的人数;随后一行中列出M个待查询的ID,以空格分隔。
    
    注意:没有朋友的人可以是根本没安装“朋友圈”,也可以是只有自己一个人在朋友圈的人。虽然有个别自恋狂会自己把自己反复加进朋友圈,但题目保证所有K超过1的朋友圈里都至少有2个不同的人。
    
    输出格式:
    
    按输入的顺序输出那些帅到没朋友的人。ID间用1个空格分隔,行的首尾不得有多余空格。如果没有人太帅,则输出“No one is handsome”。
    
    注意:同一个人可以被查询多次,但只输出一次。
    
    输入样例1:
    3
    3 11111 22222 55555
    2 33333 44444
    4 55555 66666 99999 77777
    8
    55555 44444 10000 88888 22222 11111 23333 88888
    输出样例1:
    10000 88888 23333
    输入样例2:
    3
    3 11111 22222 55555
    2 33333 44444
    4 55555 66666 99999 77777
    4
    55555 44444 22222 11111
    输出样例2:
    No one is handsome
    
    
    #include <iostream>  
    #include <cstdio>  
    #include <cstring>  
    using namespace std; 
    int F[100005];  
    int visit[100005];  
    int Root[105];  
    int get_far(int x){  
        return F[x] == x ? x : F[x] = get_far(F[x]);  
    }  
    int Union(int x,int y){  
        int a = get_far(F[x]),b = get_far(F[y]);  
        if(a != b)  
            F[a] = b;  
    }  
    int main()  
    {  
        int n;  
        while(cin>>n){  
            for(int i = 0;i < 100005;i ++)  
                F[i] = i;  
            int len = 0;  
            while(n--){  
                int m,root;  
                scanf("%d%d",&m,&root);  
                for(int i = 1;i < m;i ++){  
                    int temp;  
                    scanf("%d",&temp);  
                    Union(root,temp);  
                }  
                if(m != 1)  
                    Root[len++] = get_far(F[root]);  
            }  
            int k;  
            cin>>k;  
            int flag = 0,ans = 0;  
            memset(visit,0,sizeof(visit));  
            for(int i = 1;i <= k;i ++){  
                int f;  
                scanf("%d",&f);  
                if(!visit[f]){  
                    int ok = 0;  
                    visit[f] = 1;  
                    for(int j = 0;j < len;j ++)  
                        if(get_far(F[f]) == Root[j])  
                            ok = 1;  
                    if(!ok){  
                        if(flag)    cout<<" ";  
                        printf("%05d",f);  
                        flag = 1;  
                        ans = 1;  
                    }  
                }  
            }  
            if(!ans)  
                cout<<"No one is handsome"<<endl;  
            else  
                cout<<endl;  
        }  
        return 0;  
    }
    
    
    并差集的应用,功能如题目所示。
    优点:巧妙运用并查集的方法,化繁杂的问题为简单的问题,就是用并查集将朋友圈的数据整合到一起,方便后序数据的查找。
    
    

    相关地址

    5. 代码Git提交记录截图

  • 相关阅读:
    [每天进步一点 流水账]第4周
    单指令流多数据流( SIMD)
    [每天进步一点 流水账]第2周
    写时复制技术(COW)
    ECMAScript 运算符乘性运算符
    ECMAScript 运算符Boolean 运算符
    ECMAScript 基础保留字
    ECMAScript 基础关键字
    ECMAScript 运算符一元运算符
    ECMAScript 基础原始类型
  • 原文地址:https://www.cnblogs.com/doimpossible/p/8974180.html
Copyright © 2020-2023  润新知