20172333 2018-2019-1 《程序设计与数据结构》第六周学习总结
教材学习内容总结
《Java软件结构与数据结构》第十章-树
一、树的重点(我认为)概念
- 树是非线性结构。
- 树是倒立结构,根结点是最上面的那个结节点,从上至下,上一个结点是它下面结点的双亲(这一个结点又当爹又当妈),同一个双亲的结点互相叫兄弟。没得下一代的结点叫做叶子。
- 从根节点到叶子最近的长度叫做路径长度,也称之为高度。
- 每一个结点所能含有的孩子的最大个数叫做度。一个结点最多含有N个孩子就叫这个树为N元树。
- 树分为完全树、平衡树、满树。
平衡树指的是叶子之间相差不超过两层的树。图
完全树指的是平衡树的前提下,最后一层的叶子都在左边。
-完全树的性:1.若结点有n个,树高为⌊log2n⌋ +1 。2.若树高为h,则总结点数n ≤ 2^h - 1。3.若树的深度为 k ,则第 k 层有 2^k-1 个结点 。4.结点如果有N个,则叶节点有n/2个。
-满树的是一个n元树的所有叶子在同一层。图
二、树的实现策略
- ①数组实现树的计算策略
- 可能的计算策略是将元素n的左孩子置于位置(2xn+1),将右孩子置于位置(2x(n+1))
- ②数组模拟链表来实现树
- 数组的每一个元素都是结点类,每一个结点储存的是孩子或者双亲的数组索引。
- ③树的分析
一颗含有M个元素的平衡n元树具有的高度为lognM。
三、树的遍历
①前序遍历:从根结点开始遍历,访问每一个结点及其孩子。图
②中序遍历:从根结点开始,访问结点的左孩子,然后是该结点,再然后是任何剩余节点。图
③后序遍历:从根结点开始,访问结点的孩子,然后是该结点。图
④层序遍历:从根结点开始,访问每层的所有节点,一次一层。
四、二叉树
- 二叉树:每个结点只有两个子结点的树
二叉树的操作
操作 | 说明 |
---|---|
getRoot | 返回指向二叉树跟的引用 |
isEmpty | 判定该树是否为空 |
size | 判定树中的元素数目 |
contains | 判定指定目标是否在该树中 |
find | 如果找到指定元素,则会返回指向其的引用 |
toString | 返回树的字符串表示 |
iteratorInOrder | 为树的中序遍历返回一个迭代器 |
iteratorPreOrder | 为树的前序遍历返回一个迭代器 |
iteratorPostOrder | 为树的后序遍历返回一个迭代器 |
iteratorLevelOrder | 为输的层序遍历返回一个迭代器 |
// 返回存储在树根中的元素。
public T getRootElement() throws EmptyCollectionException;
// 返回根的左子树。
public BinaryTree<T> getLeft() throws EmptyCollectionException;
// 返回根的正确子树。
public BinaryTree<T> getRight();
// 如果二叉树包含与指定元素匹配的元素,则返回true,否则返回false。
public boolean contains (T target);
// 返回对与指定目标匹配的树中的元素的引用。
public T find (T target) throws ElementNotFoundException;
// 如果二叉树不包含元素,则返回true,否则返回false。
public boolean isEmpty();
// 返回此二叉树中的元素数。
public int size();
// 返回二叉树的字符串表示形式。
public String toString();
// 返回二叉树上的预订遍历。
public Iterator<T> preorder();
// 返回二叉树上的无序遍历。
public Iterator<T> inorder();
// 返回二叉树上的后期遍历。
public Iterator<T> postorder();
// 在二叉树上执行级别遍历。
public Iterator<T> levelorder() throws EmptyCollectionException;
教材学习中的问题和解决过程
- 问题1:树的四种遍历方法,只有最后一种层序遍历我看懂了,其他三种它的介绍都很复杂,有没有更简单的说明?
- 解答:各个方法的顺序。
- 先序:结点,左子树,右子树
- 中序:左子树,结点,右子树
- 后序:左子树,右子树,结点
- 问题2:树型数据结构有什么用?
- 解答:就是一种非线性数据结构,百度了许多全是相关的实现,完全没人提过这个东西有什么用,学来干啥,大概就是锻炼思维的吧。
- 问题3:我只之前看到的树都是由一条条线连接的,看起来是方便,但是并没有包含其实质内涵。
- 解答:图
代码调试中的问题和解决过程
问题1:在最后进行测试代码的编写过程中出现爆红现象
解决:最后发现我这个结点的另外两个结点还在后面才实例化,导致前搜索的时候没有这两个结点。
代码托管
-图代码
上周考试错题总结
- 无
结对及互评
基于评分标准,我给李楠的博客打分:7分。得分情况如下:
正确使用Markdown语法(加1分)
模板中的要素齐全(加1分)
教材学习中的问题和解决过程, (加3分)
代码调试中的问题和解决过程, 无问题
感想,体会真切的(加1分)
点评认真,能指出博客和代码中的问题的(加1分)
点评过的同学博客和代码
- 本周结对学习情况
- 20172330李楠
- 结对照片
- 结对学习内容
- 树
其他(感悟、思考等,可选)
看不懂。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 0/0 | 1/1 | 10/10 | |
第二周 | 0/0 | 1/2 | 10/20 | |
第三周 | 1500/1500 | 1/3 | 10/30 | |
第四周 | 2761/4261 | 2/5 | 25/55 | |
第五周 | 814/5075 | 1/6 | 15/70 | |
第六周 | 1091/6166 | 1/7 | 15/85 |