DS博客作业05--树

1.本章学习总结1474668-20190311232112567-1743332292.gif

1思维导图

1474668-20190523235427902-1322924021.png

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代码截图

1474668-20190526181919200-1976478979.png

2.1.3本题PTA提交列表说明

1474668-20190526181930707-1101179079.png

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代码截图

1474668-20190526181947789-2092450820.png
1474668-20190526181956098-1860415311.png

2.2.3本题PTA提交列表说明

1474668-20190526182008597-665724630.png

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代码截图

1474668-20190526182026783-243692366.png
1474668-20190526182034962-2061356337.png

2.3.3本题PTA提交列表说明

1474668-20190526182049985-699384683.png

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

3.阅读代码

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

1474668-20190526231522279-964148187.png

3.2 解题思路

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

3.3 代码截图

1474668-20190526231811315-1999520965.png
1474668-20190526231823517-38417836.png

3.4 学习体会

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

转载于:https://www.cnblogs.com/asings/p/10887092.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值