博客作业04--树

一、学习总结(2分)

1.树结构思维导图

2 树结构学习体会

  • 学习数据结构觉得比C难多了,就算理解了概念什么的代码还是不会打,看了代码之后又忘记了,就像小亮学长上次讲期中考试卷时候说的,数据结构没什么好说的,代码得背。
  • 这次的PTA做了好久,博客也是一点一点补起来的,理解容易代码难打。
  • 树这一部分教完了之后感觉也还好,背好代码!!务必多多看书+背代码背代码背代码!

二、PTA实验作业(4分)

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

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

InitExpTree函数 //建表达式的二叉树
    定义字符型栈op存放运算符
    定义结构体bt存放表达式
    
    #号放入栈底
    while(str[i]!='\0')
	if(str[i]不是运算符)
            层次遍历法将数据存到bt中 
            i++; 

	else  //调用Precede()函数比较优先级
	    if(栈顶元素优先级低于所比较元素 )
		str[i++]进op栈内

	    else if(栈顶元素优先级等于所比较元素)
		op栈顶元素出栈,i++

	    else if(栈顶元素优先级高于所比较元素)
		栈顶元素出栈,其data存入bt中,所比较元素进栈
    end while;

    while(栈顶元素不为'#')
	输出栈内剩余操作符
EvaluateExTree函数计算表达式树
    double m, n;
    if(只有根节点) 返回根节点的值

    m = EvaluateExTree(T->lchild);
    n = EvaluateExTree(T->rchild);
	    
    if(T->data为'+') 返回m+n的值
    else if(T->data为'-') 返回m-n的值
    else if(T->data为'*') 返回m*n的值
    else if(T->data为'/')
        if(分母为0)
	    输出"divide 0 error!"
            exit(0);
        else 返回m/n的值

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



3.PTA提交列表说明。

  • 做这道题的时候那个循环老是不对,i++找错位置,用for不对改成while就对了,因为for里的i自增的位置不同,导致段错误,前面一直改不出来。

题目2:7-2 根据后序和中序遍历输出先序遍历

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

CreateBT函数构造二叉树 
    定义结构体指针b,整型指针p,整型变量r,k

    if(n<=0)返回空;
    将根节点值赋给r

    for p=in to in+n-1  //中序遍历中查找根节点
	if(找到根节点) 跳出循环

    k=p-in为根节点在中序遍历里的下标

    /*递归调用,构造用左子树和右子树*/
    b->lchild = CreateBT(post, in, k);
    b->rchild = CreateBT(post+k, p+1, n-k-1);
    返回b;
PreOrder函数//先序遍历二叉树
    if(树BT不为空)
        if(此时BT指向根节点)
	    输出BT->data;
        else if (BT不指向根节点) 
            输出空格+BT->data;
        /*递归调用遍历左右子树*/
	PreOrder(BT->lchild);
	PreOrder(BT->rchild);

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


3.PTA提交列表说明。

  • 这道题问题不是很大,主要就是根据中序和后序遍历创建出二叉树这个函数。先从后序遍历找到根节点,再在中序遍历中找出与根节点相同的数据的下标,该下标左边所有字符为其左子树的中序遍历,右边的则为右子树的中序遍历,以此递归构建左右子树。

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

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

int main()
    char str[100];
    gets(str);
    int len=0, i, sum=0;

    if(无数据,即为空树)
        输出"0";
        return 0;

    len = strlen(str);
    for i=1 to len/2-1 //除最后一层进行遍历
        if(该节点为叶子节点)
            sum += (str[i]-'0')*(int)(log2(i)); //int强制转换,求所在层数-1的值,即边的数目

    for(i=i to len-1) //最后一层,有数据的均为叶子结点
        if(数据为不#,即为叶子节点)
            sum += (str[i]-'0')*(int)(log2(i));
  输出sum
  return 0;

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

3.PTA提交列表说明。

  • 其实做这道题的时候,本来是用书本上那种构造函数的方法做的,但是一直都只有树为空这一个测试点通过,另外几个测试点就在段错误和答案错误之间徘徊,后来就干脆依照二叉树的性质做完了这道题,并没有利用结构体创建树。可以的话我还是想要搞懂一下书上教的正规的写法的。。。

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

本次题目集总分:285分
必做题共:230分

1.PTA排名

2.我的得分:230 得2.5分

四、阅读代码(必做,1分)

修理牧场

功能: 用队列优先将队列元素从小到大排列,小的先出队。主要步骤为:将木块锯成两截,再将长的锯成成两截,重复以上操作。实现、、即可得出将给定长度木头锯成N块的最少花费。
(ps:我刚写这道题的时候是部分正确,没有好好利用队列的出入队,三层嵌套循环使得程序运行超时,一直想想不出更加简洁的方法,百度了一下终于搞清楚,,所以说队列和树的结合使用还需加强!)

五、代码Git提交记录截图

posted on 2018-05-05 19:58  黑白熊熊  阅读(208)  评论(2编辑  收藏  举报

导航