• DS博客作业05--树


    1.本周学习总结

    1.思维导图

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

    本周学习了树的知识,我懂得了如何建树和如何先中后序遍历树。大部分树的实现都是通过递归实现树的建立和删除,这使我更加理解了上学期没学太明白的递归算法。树中我们接触最多的可能就是二叉树了,也学到了很多二叉树的性质,明白了二叉树和森林之间是可以相互转换的。也懂了树的遍历有多种方法,比如层次遍历和递归遍历,这些递归方法也衍生出了很多建树的方法。个人最喜欢哈夫曼树的学习,感觉哈夫曼编码是特别有意思的一件事。对于上周的学习,最不明白的可能就是线索二叉树了,不太明白怎么判断一个叶子节点的前驱节点和后继节点,希望能加以理解。
    

    2.PTA实验作业

    2.1.题目1:7-4 jmu-ds-二叉树叶子结点带权路径长度和

    2.1.1设计思路(伪代码)

    建树函数
    生成一个新节点
    把str[i]赋给节点的值
    如果该节点的左节点不存在或者为‘#’
    赋给NULL
    else
    左节点=CreatBTree(str,2*i);
    如果该节点的右节点不存在或者为‘#’
    赋给NULL	
    else
    右节点=CreatBTree(str, 2*i + 1);
    return 树
    权值计算函数
    如果一个节点为空
    return NULL;
    如果一个节点左右孩子皆不为空
    wpl+=(该节点对应的数据-'0')*层数
    AddQuan(指向该节点的左孩子,层数加一,wpl);
    AddQuan(指向该节点的右孩子,层数加一,wpl);
    return wpl;
    

    2.1.2代码截图


    2.1.3本题PTA提交列表说明。


    ps:还是那句话,有些人,只是表面光鲜亮丽,就像我这样。

    说明

    • 1.建树函数未加str[i]!='#'的判断,导致数建立的结构错误。
    • 2.节点存放的数据是char类型的,而在计算全职的时候忘记减去一个‘0’。
    • 3.传层数的时候从1开始传,结构更大。

    2.2.题目2:7-3 jmu-ds-二叉树层次遍历

    2.2.1设计思路(伪代码)

    建树函数
    生成一个新节点
    把str[i]赋给节点的值
    如果该节点的左节点不存在或者为‘#’
    赋给NULL
    else
    左节点=CreatBTree(str,2*i);
    如果该节点的右节点不存在或者为‘#’
    赋给NULL	
    else
    右节点=CreatBTree(str, 2*i + 1);
    return 树
    
    输出函数
    建一个结构类型为BTree的队列q;
    int t=0;
    定义两个类型为BTree的变量curNode, lastNode;
    curNode = lastNode = bt;
    int level = 0;
    如果该节点的数据不为NULL
    将节点的数据入队
    else
    输出NULL
    入队对不为空
    curNode=q队列的队头;
    如果t=0
    输出<<curNode的值
    t=1;
    else
    输出“ curNode的值”;
    如果curNode的左节点不为空
    将curNode的左节点入队
    如果curNode的右节点不为空
    将curNode的右节点入队
    q.pop()
    

    2.2.2代码截图


    2.1.3本题PTA提交列表说明。

    说明:

    • 1.忘记空格的输出。
    • 2.对curNode的左右节点的判断没有把控。

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

    2.3.1设计思路(伪代码)

    建树函数
    定义一棵树bt2
    如果节点个数小于0
    return NULL
    定义一个新节点bt2
    bt2的数据为str[m-1]
    将其左右孩子皆设为NULL
    for i=0 to m
    如果str[m-1]=str[i]
    break;
    end for
    bt2的左孩子=CreatBinTree(i,str2,str1);
    bt2的右孩子=CreatBinTree(m-i-1,str2+i+1,str1+i);
    return bt2;
    
    先序输出函数
    如果bt=NULL;
    return;
    输出“ bt的数据”
    PreorderPrintLeaves(bt的左孩子);
    PreorderPrintLeaves(bt的右孩子);
    

    2.3.2代码截图


    2.3.3本题PTA提交列表说明。

    说明

    • 1.因为是直接引用函数题的代码而结构体定义错误,把BinTree写成了BTree。
    • 2.在建树的时候,忘记将左右孩子的数值设为NULL。

    3、阅读代码

    3.1 题目:7-13 是否完全二叉搜索树(2016pta天梯赛题目)

    将一系列给定数字顺序插入一个初始为空的二叉搜索树(定义为左子树键值大,右子树键值小),你需要判断最后的树是否一棵完全二叉树,并且给出其层序遍历的结果。
    

    3.2 解题思路

    先根据数值的大小判断哪些为左子树和右子树,并给定一个值判断是否该节点是否有填入值,进而判断是否为完全二叉搜索#树

    3.3 代码截图

    3.4 学习体会

    这题是2016年pta天梯赛的一道树的题目,乍一看可能会用到树的结构,实则不用。他很巧妙的用一个中间值来判断是否该节点是否有数值,并用数组来实现代码的编写。有时候写代码不能光看题目的表面,最重要的是理解题目并使用最简的方法去降低代码的复杂度,从而提高代码的时间和空间的利用率。
    
  • 相关阅读:
    未进入Kali Linux系统修改修改密码的方法
    SQL 修改字段名,数据类型,增加字段
    在 SAE 上部署 ThinkPHP 5.0 RC4
    在 C# 里使用 F# 的 option 变量
    Retinex图像增强和暗通道去雾的关系及其在hdr色调恢复上的应用
    暗通道去雾算法的python实现
    解析hdr图像文件的python实现
    博客说明
    retinex图像增强算法的研究
    我知道的JavaScript设计模式(桥接)应用之验证器
  • 原文地址:https://www.cnblogs.com/ashinluox/p/10887067.html
Copyright © 2020-2023  润新知