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天梯赛的一道树的题目,乍一看可能会用到树的结构,实则不用。他很巧妙的用一个中间值来判断是否该节点是否有数值,并用数组来实现代码的编写。有时候写代码不能光看题目的表面,最重要的是理解题目并使用最简的方法去降低代码的复杂度,从而提高代码的时间和空间的利用率。
posted @ 2019-05-18 21:00  AshinLuoX  阅读(189)  评论(0编辑  收藏  举报