博客作业05--树

本周学习总结

1.思维导图

2.谈谈你对树结构的认识及学习体会。

树,整体来说,我依然很薄弱。pta,简单题对着书敲一敲还可以,一边敲,一边背,但说实话,这都是短时记忆,总是不那么牢靠,先理解,在记忆,我也常常会出现许多状况,就单是上机考试里出现dev运行结果都是对的,pta却过不了的状况,实属让人手忙脚乱,反复确认自己的记忆没出现问题,确认思路也无什么问题。其实这些东西不过是小小的没有赋初始值。大作业在编写代码上我并没有参与,我不过是对于组员的劳动成果进行理解罢了,我深知自己实力不够,对于代码的看懂我都需要询问当事人,再细细理解。

2.PTA实验作业

2.1.还原二叉树

2.1.1设计思路(伪代码)

- main函数
    定义n,h,pre[50],in[50],T
    输入 n,pre,in
    T=CreatTree(pre,in,n);
    h=GetHeight(T);
    输出 h
- 建树
    定义 T,*p, k
    if(n<=0)   return NULL
    建立T的节点空间
    T->data=*pre
    for(p=in;p<in+n;p++)
       if(*p==*pre) break
    k=p-in
    T->lchild=CreatTree(pre+1,in,k)
    T->rchild=CreatTree(pre+k+1,p+1,n-k-1)
     返回T
- 高度
    定义LH, RH;
    if(T==NULL)
       return 0;
    LH = GetHeight(T->lchild)
    RH = GetHeight(T->rchild)
    返回LH > RH ? ++LH : ++RH

2.1.2代码截图



2.1.3本题PTA提交列表说明。

  • 最开始在pta上打代码,打了一般,就先提交保存了,所以编译错误
  • 建树的递归有一些问题,最开始直接运用T->lchild=CreatTree( s, 2 * i)这个,但是建的不对,最后借鉴了一下别人的方法,改正了一下

2.2 二叉树叶子结点带权路径长度和

2.2.1设计思路(伪代码)


- 建树
  if (i<s.length())
        if (s[i] == '#')
            T = NULL
        else
            T 建立节点空间
            T->data = s[i]
            T->lchild=CreatTree( s, 2 * i)
            T->rchild=CreatTree( s, 2 * i + 1)
        
    else T = NULL;
  返回T
- 路径
  if T为空    sum+0
     else
       if (!T->lchild && !T->rchild)
            sum += (T->data - '0')*i
       CountWPL(sum, T->lchild,i+1)   //递归
       CountWPL(sum, T->rchild,i+1)
- main函数
    定义字符串s,树T,整数sum
    输入s
    sum赋值0
    T=CreatTree(s, 1)
    CountWPL(sum, T,0)
    输出sum


2.2.2代码截图


2.2.3本题PTA提交列表说明。

  • 起先是照着答案敲的
  • 自己背了,理解了,重新敲了一下,但是sum没赋值,答案错误

2.3 输出二叉树每层节点

2.3.1设计思路


- 建树
  if (i<s.length())
        if (s[i] == '#')
            T = NULL
        else
            T 建立节点空间
            T->data = s[i]
            T->lchild=CreatTree( s, 2 * i)
            T->rchild=CreatTree( s, 2 * i + 1)
        
    else T = NULL;
  返回T
- main函数
        定义字符串s,树T,整数i
	输入s
	i赋值为0
       建father,child队列
	T=CreatTree(s, 1)
    if(T)
        输出i和相应格式
        父亲队进队
        i++;
    else
        输出NULL
    while(!father.empty())
        if(father.front()->lchild)
        child.push(father.front()->lchild)
        if(father.front()->rchild)
        child.push(father.front()->rchild)
        输出father.front()->data和相应格式
        出队
        if(father.empty())
        	if(!child.empty()) 
                  输出i和相应格式
        	while(!child.empty())
        		将孩子进父亲的队
        		出队
        	i++

2.3.2代码截图


2.3.3本题PTA提交列表说明。

  • 这是直接对着答案并记忆以后,对着dev敲,运行成功后提交的

3、阅读代码

3.1 检验二叉搜索树



3.2 解题思路

  • 先判断树为空的情况
  • 左子树
    • 判断左子树的元素与根元素的大小
    • 再进行以左子树作为根的,其右子树的大小判断
  • 右子树
    • 判断右子树的元素与根元素的大小
    • 再进行以右子树作为根的,其左子树的大小判断

3.3 代码截图

3.4 学习体会

   题目不是特别难的题目,方法也比较直接。但是这是我看到的这题代码中,我可以直接看懂,并觉得自己写,也会朝着这方面写的的代码。其中,左右子树与跟之间的判断这一步骤让我受益匪浅。又一次了解了孩子节点转化为相应的根节点这一步骤。

posted on 2019-05-17 23:57  白居过隙巍澜可期  阅读(190)  评论(0编辑  收藏  举报

导航