DS博客做业05--树

1.本周学习总结

1.思惟导图

2.本周学习总结

学习了树结构以后,整体感受比以前的两种结构,线性和栈队列都要复杂,由于树形结构的实现方法不是惟一的,能够用到链式结构,也能够用到递归操做。在学习递归的时候,须要明确递归口和递归传入的参数,刚开始学习的时候,这两块地方老是会不清楚。结构体也是树必不可少的,须要明白何时须要兄弟节点,何时须要的是左右孩子节点,这个也是一个须要明确的地方。建树以及各类须要的函数得在主函数中串联起来,函数中须要的变量也要在主函数中声明,BTree bt这个指针须要动态分配内存。总的来讲,树结构仍是须要多看视频和多作题才会有感受。算法

2.PTA实验做业

2.1.题目1:

7-3 jmu-ds-二叉树层次遍历 (25 分)
层次遍历树中全部节点。 输入一行字符串表示二叉树的顺序存储结构,好比字符串“#ABCD#EF#G##H##I”,#表明空节点。第一个#不使用。数组

2.1.1设计思路

2.1.2代码截图





2.1.3本题PTA提交列表说明。



·Q1:第一次的错误在于对输出没有注意到,也就是PreOrder实际上是个没有用的函数
·A1:把主函数中的PreOrder注释掉
·Q2:第二次错误在于遍历的那个函数没有使用两个指针,我觉得一个就够了,没想到在后面逐层遍历的时候出问题了
·A2:定义两个指针,直接把树用另一个栈进行操做函数

2.2 题目2:

7-4 jmu-ds-二叉树叶子结点带权路径长度和 (25 分)
二叉树叶子结点的带权路径长度指:叶子结点的权重路径长度。本题要求算出二叉树全部叶子结点的带权路径长度和。 以下面的二叉树:学习

2.2.1设计思路

2.2.2代码截图


2.2.3本题PTA提交列表说明。


·Q1:第一次的答案错误是由于wpl函数里面的递归没法直接使用lchild和rchild vs提出错误
·A1:在主函数和wpl函数中都声明了一下发现没有改变问题 就暂时没去动这个问题
·Q2:检查完程序以后发现主函数中函数调用传参出了问题 应该把1传进去而不是n
·A2:修改以后进行提交 直接就过了 第一个问题看起来不是大问题 可是不知道为啥vs报错了设计

2.3 题目3:7-2 根据后序和中序遍历输出先序遍历 (25 分)

本题要求根据给定的一棵二叉树的后序遍历和中序遍历结果,输出该树的先序遍历结果。3d

2.3.1设计思路

2.3.2代码截图


2.3.3本题PTA提交列表说明


·Q1:第一次错误的缘由是宏定义数组的时候类型声明错误 定义成char类型的了后面输入的时候就有问题
·A2:改变了定义类型 使用整型输入
·Q2:第二次错误是格式错误 在最后输出的时候多出了一个空格
·A2:调整一下输出指针

三、阅读代码

3.1 题目

有一棵二叉树,树上每一个点标有权值,权值各不相同,请设计一个算法算出权值最大的叶节点到权值最小的叶节点的距离。二叉树每条边的距离为1,一个节点通过多少条边到达另外一个节点为这两个节点之间的距离。
给定二叉树的根节点root,请返回所求距离。视频

3.2 解题思路

这道题的解题较为麻烦,分做两大步骤
1 标记每一个节点的父节点,而且找出最大叶节点和最小叶节点
用map<int,pair<int,int>>标记每一个子节点的父节点,first是子节点值,second是<父节点值,父节点位置>
用queue遍历二叉树的节点
依次把每一个父节点的子节点push进队列,每取出一个节点处理,计数加1,而后处理取出节点的左右孩子进行标记
处理完以后,把取出的节点pop出去
2 计算两个叶节点的最短路径
分别找出两个叶节点到树根的路径,公共部分之前的路径相加即最短路径blog

3.3 代码截图




3.4 学习体会

没想到孰能解决的问题这么多,这道题看起来不是很难,只要找出权值最大的节点和权值最小的叶节点,而后在计算他们之间的距离。可是实际操做起来的话,首先找权值的问题是要先遍历一遍整棵树,把权值记录下来,而后进行比较找出两个节点,而后在进行遍历,便利的同时记录下来路径,存放好路径以后再使用一个函数进行计算路径。这道题用了不少的书的操做,建立左右子树,遍历子树,而后就是栈和队列的操做,很值得学习和深思。递归

相关文章
相关标签/搜索