• 博客作业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提交记录截图

  • 相关阅读:
    Windows 8实例教程系列 开篇
    qt 开发发布于 windeploy.exe
    qt qoci 测试验证
    vmware vmx 版本不兼容
    qt oracle
    vc qt dll
    QOCIDriver unable to create environment
    qoci 编译完 放置位置 具体根据情况
    calling 'lastError' with incomplete return type 'QSqlError' qsqlquer
    Hbase 操作工具类
  • 原文地址:https://www.cnblogs.com/doimpossible/p/8974180.html
Copyright © 2020-2023  润新知