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 分)

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

2.3.1设计思路

2.3.2代码截图


2.3.3本题PTA提交列表说明


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

3、阅读代码

3.1 题目

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

3.2 解题思路

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

3.3 代码截图




3.4 学习体会

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

posted @ 2019-05-18 16:24  林炜  阅读(594)  评论(0编辑  收藏  举报