• DS博客作业05--树


    1.本章学习总结

    1思维导图

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

    这一段时间学了树(二叉树),感觉树的内容很难,内容比较难弄懂,所以还是得花时间去理解,总之要学起来真的不容易。在老师的课上跟着老师走对于树概念和一些操作有了一定的理解(实际上理解透的却没有),自己下来实操代码还是对于我来说有点难不会做。树有二叉树,哈夫曼树等等的特殊结构的树,遍历的方式也是多种多样(中序遍历,先序遍历、后序遍历、层次遍历)。在树这一章,因为要建树递归的用法真的是太常见了所以是重中之重,递归方面的内容,只能硬背下来了。

    2.PTA实验作业

    2.1.题目1:

    7-1 还原二叉树 (25 分)

    2.1.1设计思路(伪代码)

    函数声明:int Cnt(char *preorder, char *inorder, int n);
    int main
    {
        分别定义两个字符型数组 preorder,inorder;
        int N;
        将题目的先序,中序字符串输入;
        调用函数Cnt返回二叉树高度的值
    retur你0;
    }
    Cnt(char *preorder, char *inorder, int n)
    {
        if二叉树为空就返回0;
       定义循环变量i,定义变a,b;
    
    for (i=0至n)
    如果先序数组的第一个元素与中序数组的第i个;
    运用递归的思想逐个元素对应;
    计算并返回树的高度
    
    

    2.1.2代码截图

    2.1.3本题PTA提交列表说明

    A:编译错误
    B:一开始函数递归的方法错了
    B:返回的a,b值运算出错

    2.2题目2:

    7-3 jmu-ds-二叉树层次遍历 (25 分)

    2.2.1设计思路(伪代码)

    运用编译更安全的csting类,和队列容器
        定义树的数据结构,节点数据data,左右孩子left,right;
        定义建树函数和等级函数;
    int main
    {
        定义队列que,变量i,wpl=0,字符型数组str;
        判断树组为空,cout<<NULL;
        调用建树和等级函数;
    }
    
    BinTree建树
    {
    new 空间
            if(没到数组尾并且左孩子为#)
    树的叶子节点置为 NULL;
            else 递归建树
        if(没到数组尾并且右孩子为#)
    树的叶子节点置为 NULL;
         else 递归建树
    }
    
    LevelTraversal层次遍历
    {
    int flag=0;
     BT入队  while(队不为空)
        如果出队分别对应树的左右孩子,则入队;
        由flag的变化控制格式输出树的没一层节点数据
    }
    
    

    2.2.2代码截图


    2.2.3本题PTA提交列表说明

    A:部分正确原因
    B:一开始建树没有把左右孩子的空情况考虑完全
    B:在层次遍历时少了出队要pop()

    2.3.题目3:

    7-4 jmu-ds-二叉树叶子结点带权路径长度和 (25 分)

    2.3.1设计思路(伪代码)

    运用编译更安全的csting类
        定义树的数据结构,节点数据data,左右孩子left,right和记录等级变量level;
        定义建树函数和wpl函数;
    int main
    {
        定义变量i,wpl=0,字符型数组str;
        判断树组为空,cout<<NULL;
        调用建树和wpl函数;
    }
    
    BinTree建树
    {
    new 空间
        定义t=2*i(运用下标来找树的层数)
    cnt++来记录
    
            if(没到数组尾并且左孩子为#)
    树的叶子节点置为 NULL;
            else 递归建树
        if(没到数组尾并且右孩子为#)
    树的叶子节点置为 NULL;
         else 递归建树
    }
    
    CntWPL算wpl函数
    {
    int result = 0;
     if (非left 和非right)
    	result += 叶子节点数据字符转换为数据*bt(每个节点的带权值)
        	if (左孩子)
    		result += CntWPL(bt->left);
            if (右孩子)
    		result += CntWPL(bt->left);
        返回result;
    }
    

    2.3.2代码截图


    2.3.3本题PTA提交列表说明

    A:部分正确
    B:树的每一层记录值多了1
    B:没有考虑到层次为0,t的值的问题

    3.阅读代码

    3.1.题目:二叉树的最低共同祖先

    3.2 解题思路

    公共祖先结点一定在这两条路径上,且在最靠后的位
    置,在对比倒着挨个查找就能得到结果。我们可以用2个栈来保存这两个结点的路径,每当遇到一个结点,我们就先将这个结点
    先入栈,然后查看这个结点是否是
    我们最终要找的那两个结点,如果是,则当前栈里的结点顺序就是我们想要的路
    径,结束查找,如果不是,递归的去该结点的左子树和右子树里查找,如果都没
    有找到,说明以该子树没有我们想要的结点,自然它肯定不在最终路径上,将其
    出栈即可
    
    

    3.3 代码截图


    3.4 学习体会

    对于二叉树,二叉树的各个层和叶子节点,本题将二叉树的节点顺序化,这样的好处就是祖先更加明确;
    运用栈和队列来辅助树的操作可以让操作更加简单

  • 相关阅读:
    JS常用自定义方法
    mybatis like用法
    设计模式之前之UML
    DSU模板(树的启发式合并)
    【hihocoder编程练习赛9】闰秒
    静态链接与动态链接的区别【转】
    pragma指令详解(转载)
    Crawl(2)
    Crawl(1)
    Treap
  • 原文地址:https://www.cnblogs.com/asings/p/10887092.html
Copyright © 2020-2023  润新知