zoukankan      html  css  js  c++  java
  • 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学习体会

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

  • 相关阅读:
    MySQL笔记(6)---锁
    MySQL笔记(5)---索引与算法
    MySQL笔记(4)---表
    MySQL笔记(3)---文件
    MySQL笔记(2)---InnoDB存储引擎
    MySQL笔记(1)---MySQL体系结构和存储引擎
    生成器,迭代器,装饰器
    文件操作、def函数、模块导入、json
    数据类型、字符串操作
    基本数据类型,条件判断
  • 原文地址:https://www.cnblogs.com/ljwclot/p/10887342.html
Copyright © 2011-2022 走看看