DS博客作业05--树

1.本周学习总结

1.思维导图

2.学习体会

树的学习,从前面的线性结构突然到了非线性结构,感觉更加抽象了,难度也大了不少,对于课本上的概念还有一些算法,认真预习看书后也还是可以理解,但真的要打pta就感觉是另外一回事了,就算上课听了老师的思路去打还是有些吃力,有些不知从哪下手

2.PTA实验作业

2.1.题目1:7-1 还原二叉树

2.1.1设计思路

    #include<iostream>
    #include<string.h> 
    using namespace std;
    int GetHigh(char *preorder,char *inorder,int n );
    int main()
    {
        char preorder[50];                          
        char inorder[50];                           //定义两个字符数组存放中序和前序序列;
        int n;
        int High;
        cin>>n;                                                             //输入结点个数;
        cin>>preorder>>inorder;                                   //分别输入前序序列和中序序列;
        High=GetHigh(preorder,inorder,n);                     //调用函数求二叉树的高度;
        cout<<High;
        return 0;
   }


    int GetHigh(char *preorder,char *inorder,int n)
    {
       int i,a,b;
       if(n==0)
   {                      
      return 0;
   }                                                                //判断树是否为空,如果为空则返回0;
      for(i=0;i<n;i++)
      if(preorder[0]==inorder[i])                       //判断出根结点所在的位置后跳出循环
   			break;
   	a=1+GetHigh(preorder+1,inorder,i);                             
   	b=1+GetHigh(preorder+i+1,inorder+i+1,n-1-i);    //递归分别求出左右子树的高度;
   	return a>b?a:b;                                            //返回树的高度


    }

2.1.2代码截图


2.1.3PTA提交列表及说明

Q1:没有考虑树为空的情况出现了段错误
Q2:改了段错误后还是有最后一个测试点不过,后边认真审题后发现是数组的大小不够,题目要求N<=50

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

2.2.1设计思路

    #include<iostream>
    using namespace std;
    typedef struct node *BinTree;
    struct node
    {
               int data;
               BinTree left;
               BinTree right;	
    };
     typedef struct node  btNode;
     BinTree CreatTree(int *lateorder,int *inorder,int n );                    //建树函数;
     void PrintBinTree(BinTree BT);                                        //输出函数;
    int main()
   {
        int n,i;
        cin>>n;
        int lateorder[30];
        int inorder[30];
        for(i=0;i<n;i++)
        cin>>lateorder[i];
        for(i=0;i<n;i++)
        cin>>inorder[i];                                    //定义两个数组存放后序序列和中序序列;
        BinTree BT=CreatTree(lateorder,inorder,n);      //根据后序序列和中序序列建树;
           cout<<"Preorder:";
       PrintBinTree(BT);                                                //调用函数输出前序序列
       return 0;	
    }
    BinTree CreatTree(int *lateorder,int *inorder,int n )
    {
        if(n==0)return NULL;                                    //判断树是否为空;
        int i;
        for(i=0;i<n;i++)
 if(inorder[i]==lateorder[n-1])
  break;                                                             //找到根结点,跳出循环;
  BinTree BT= new btNode;                                   //动态分配空间;
  BT->data=lateorder[n-1];                              
  BT->left=CreatTree(lateorder,inorder,i);
  BT->right=CreatTree(lateorder+i,inorder+i+1,n-i-1);              //递归建立左右子树
  return BT;
    }
    void PrintBinTree(BinTree BT)
   {
if(!BT)return; 
cout<<" "<<BT->data;                                           //前序输出树的每一个结点
if(BT->left)PrintBinTree(BT->left);   
if(BT->right)PrintBinTree(BT->right);                                                
return;
    }

2.2.2代码截图


2.2.3PTA提交列表及说明

Q1:在输出前面没加“preorder”,出现各种错误,改了之后还是部分正确;
Q2:数组大小不足,最后一个测试点没过,把数组大小改成30就过了

2.3.题目3:6-3 求二叉树高度

2.3.1设计思路

    int GetHeight( BinTree BT)
    {
    int m,n;                                //定义m,n来存放左右子树的高度;
    if(BT==NULL)
    return 0;                              //判断树是否为空;
    else
{
    m=GetHeight(BT->Left);                   //递归求左子树的高度
    n=GetHeight(BT->Right);                .//递归求右子树的高度
    if (m>n)
    return(m+1);
    else                                         //判断左右子树的高度后返回树的高度
    return(n+1);
}
    }

2.3.2代码截图

2.3.3PTA提交列表及说明

3.阅读代码

3.1题目[Leetcode] Sum root to leaf numbers求根到叶节点的数字之和

3.2解题思路

遇到空节点,说明其没有左右孩子了,而且对应的值为0;遇到一般节点,则由sum直接加上当前节点的值;遇到叶节点,说明递归到最底端了,本次的递归结束,返回sum

3.3代码截图

3.4学习体会

通过这个题目的学习,我更深切体会到了递归在树这一块的重要性,几乎处处都有用到递归,建树,遍历,几乎每一个操作都用,而且要根据会遇到不同的情况构造递归条件,比如这个题目中在遍历结点时如何处理空结点,一般结点,叶结点。

posted @ 2019-05-18 22:09  simonsC  阅读(224)  评论(0编辑  收藏  举报