DS博客作业05--树

1.本周学习总结(0--2分)
1.思维导图

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

树这一节主要的是建树比较难,其实思路都还好,就一直是实现这个功能比较难,树是从左子树开始遍历,还分前序中序和后序遍历,前序是根左右,中序是左根右,后序是左右根。

2.PTA实验作业(6分)

2.1.题目1: 还原二叉树

2.1.1设计思路(伪代码)

CreatBt函数
      首先定义 i
      然后定义先序的左子树和右子树以及中序的左子树和右子树
          if  (n是否为0或T是否为空)判断是否为空树
                如果是返回NULL
                pre[0]储存根节点的值
           if(i<n1&&in[i]!=pre[0])判断是否读到了根结点
                     如果没则持续读数赋给lin数组并且n1递增
           else
                    开始将读数赋给rin数组,n2递增 

        然后再一个for循环 
            if(i<n1+1)代表此时还是左子树
                将pre数组的值持续赋给lpre数组  m1递增
            else
                将pre数组的值赋给rpre  m2递增
                    然后就是创建函数的持续递归
                        T->lchild = CreatBt(lpre,lin,n1);	
                        T->rchild = CreatBt(rpre,rin,n2); 
GetHeight函数
定义lh和rh分别代表左子树的长度和右子树的长度
    if(BT=NULL)即空树
    else
        lh = GetHeight(BT->lchild);//左子树的长度 
        rh = GetHeight(BT->rchild);//右子树的长度 
        return (lh > rh ? lh : rh) + 1;   //返回大的子树长度+1 
                递归得出左子树和右子树的长度最后比较大小并且+1,因为有一个根结点

2.1.2代码截图



2.1.3本题PTA提交列表说明。


•Q1:没有考虑到空树的情况,导致段错误。
•Q2:最后得出较高子树的高度时直接返回,没有加一,即忽略了根节点。导致答案错误

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

2.2.1设计思路(伪代码)

 建树函数
   BiTree create  (string str ,int n)  定义str字符串数组,以及n控制数组下标
        if(读到的字符为‘#’)或者  if(n>str.size) ,即str数组长度为0
            return 返回NULL
	BT->data=str[n] 	赋予根节点值
	      BT->lchild=create(str,2*n)	       左右子树的位置
	      BT->rchild=create(str,2*n+1)
	      return 返回BT;
 求权函数
     void GetWPL(BiTree bt, int h, int&wpl)   引用定义wpl为权和,定义h为高度
          if(bt==空)   return    树空返回
          if(bt的左孩子和右孩子同时为空) 即证明这个结点是叶子结点
	        wpl+=wpl+(bt->data-'0')*h;
               GetWPL(bt->lchild, h + 1, wpl);		递归遍历子树 
               GetWPL(bt->rchild, h + 1, wpl);	

2.2.2代码截图


2.2.3本题PTA提交列表说明。


•Q1: 一开始不太熟悉递归的用法,不知道第一个函数应该怎么用递归,然后看了同学的代码明白了这一题递归是持续传入左子树以及右子树在数组中的位置

2.3.题目3:根据后序和中序遍历输出先序遍历

2.3.1设计思路(伪代码)建树函数

 先传入中序序列以及后续序列的起始位置以及他们的长度
       if( in即中序序列的值等于根节点)   //表示遍历完左子树
	break   退出遍历
     T->data=*p;        将p赋给T的根节点
         len代表长度=p-in
	T->lchild=Build(in,post,len)递归传回中序序列以及后序序列以及改变后的长度
    return T; 返回T树

先序输出T树的数
if(T不为空)
输出此时遍历到的结点的值
递归调用PreOrder函数

2.3.2代码截图

2.3.3本题PTA提交列表说明。

3、阅读代码

3.1 题目 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。

3.2 解题思路 我们遍历元素的时候,且记录元素的下标,当我们找 target-a 时候,再记录下target-a的下标

3.3 代码截图

3.4 学习体会 这个方法比较笨,但也简单暴力,时间复杂度为O(n的平方),如果借用map,回过头来检查表中是否已经存在当前元素所对应的目标元素。如果它存在,那我们已经找到了对应解,并立即将其返回。

posted @ 2019-05-18 20:43  做作业做作业  阅读(254)  评论(0编辑  收藏  举报