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