20172325 2018-2019-2 《Java程序设计》第七周学习总结
Posted 20172325dyk
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了20172325 2018-2019-2 《Java程序设计》第七周学习总结相关的知识,希望对你有一定的参考价值。
20172325 2018-2019-2 《Java程序设计》第七周学习总结
教材学习内容总结
二叉查找树
- 二叉查找树:是含附加属性的二叉树,即其左孩子小于父节点,而父节点又小于或等于右孩子。
- 二叉查找树的定义是二叉树定义的扩展。
- 二叉查找树的各种操作:
addElement:往树中添加一个元素
removeElement:从树中删除一个元素
removeAllOccurrences:从树中删除所指定元素的任何存在
removeMin:删除树中的最小元素
removeMax:删除树中的最大元素
findMin:返回一个指向树中最小元素的引用
findMax:返回一个指向树中最大元素的引用
- 在二叉查找树中:
若任意节点的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
任意节点的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
叶节点的左、右子树也分别为二叉查找树。
没有键值相等的节点。
二叉查找树的删除和插入
- 二叉查找树的插入算法:因为二叉查找树是一个其结点具有特定属性的二叉树所以它的插入算法就只需要一个方法,我二叉查找树与有序列表类似,仅需一个addElement方法就可以把一个元素插入正确的位置。具体的解决方案是:
(1)首先执行查找算法,找出被插结点的父亲结点。
(2)判断被插结点是其父亲结点的左、右儿子。将被插结点作为叶子结点插入。
(3)若二叉树为空。则首先单独生成根结点。 - 二叉查找树的删除算法:删除结点有三种情况分别是需要删除的结点是叶结点,是仅有左子树/右子树的结点,是既有左子树又有右子树的结点。
(1)删除的结点是叶结点,直接让树结点的父结点的下一个指向null即可。
(2)删除的结点是仅有左子树/右子树的结点,将该节点删除后,将该结点的左结点/右结点提到被删除结点的位置即可。
(3)删除的结点是既有左子树又有右子树的结点,这个时候需要用到中序遍历后的前驱结点,将前驱结点提到被删除结点的位置。
addElement操作:就是根据给定元素的值,在树中的恰当位置添加该元素。
如果该元素不是Comparable,该方法会抛出NoComparableElementException异常。
如果树为空,该元素称为新结点。
如果树非空,则依据二叉查找树的性质,分别与某结点及其左右孩子比较,按照左孩子<父节点,父节点<=右孩子的规则将其添加到适当位置,或者称为左右孩子的孩子。
向二叉树中添加元素
removeElement操作:从二叉查找树中删除一个元素时,必须推选出另一个结点(replacement方法找到这个结点)来代替要被删除的那个结点。
在树中找不到给定目标元素时,抛出ElementNotFoundException异常。
选择替换结点的三种情况
被删除结点没有孩子,则replacement返回null
被删除结点只有一个孩子,replacement返回这个孩子
被删除结点有两个孩子,replacement返回中序后继者(因为相等元素会放到右边)
removeAllOccurrences操作:从二叉查找树中删除指定元素的所有存在。
在树中找不到给定目标元素时,抛出ElementNotFoundException异常。
如果该元素不是Comparable,该方法会抛出ClassCastException异常。
该方法会调用一次removeElement方法,以确保当树中根本不存在指定元素时会抛出异常。
如果树中还含有目标元素,就会再次调用removeElement方法。
removeMin操作:据二叉查找树的定义,最右侧存最大的结点,最左侧存最小元素。
如果树根没有左孩子,根结点为最小,右孩子变为新的根结点。
如果左孩子是叶子结点,将父结点的引用设为null即可。
如果左孩子是内部结点,则这个左孩子的右孩子将代替自己成为它父节点的左孩子。
平衡二叉查找树
- 平衡二叉查找树,又称 AVL树。 它除了具备二叉查找树的基本特征之外,还具有一个非常重要的特点:它 的左子树和右子树都是平衡二叉树,且左子树和右子树的深度之差的绝对值(平衡因子 ) 不超过1。 也就是说AVL树每个节点的平衡因子只可能是-1、0和1(左子树高度减去右子树高度)。
- 衡量二叉搜索树搜索效率的标准:平均查找长度(ASL):每个结点比较次数和/结点数
- 平衡因子(BF):左子树的高度减去右子树的高度。
- 判断一个二叉搜索树是否为一个平衡二叉树:|BF|小于等于1当对一个平衡二叉树插入一个结点后,AVL树就变的不平衡了
- 平衡二叉树的调整:分为四种情况
(1)多余点在树的不平衡子树的根结点的右子树的右边:RR插入,需要RR旋转
(2)多余点在树的不平衡子树的根结点的左子树的左边:LL插入,需要LL旋转
(3)多余点在树的不平衡子树的根结点的右子树的左边:RL插入,需要RL旋转
(4)多余点在树的不平衡子树的根结点的左子树的右边:LR插入,需要LR旋转
红黑树
红黑树的特性:
(1)每个节点或者是黑色,或者是红色。
(2)根节点是黑色。
(3)每个叶子节点(Null)是黑色。 [注意:这里叶子节点,是指为空(NULL)的叶子节点!]即每个空结点为黑色,也即默认结点为黑色
(4)如果一个节点是红色的,则它的子节点必须是黑色的。
(5)从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点。
教材学习中的问题和解决过程
- 问题1:如何使二叉查找树在添加数据的同时保持平衡呢?
问题1解决方案:当在二叉排序树中插入一个节点时,首先检查是否因插入而破坏了平衡,若 破坏,则找出其中的最小不平衡二叉树,在保持二叉排序树特性的情况下,调整最小不平衡子树中节点之间的关系,以达 到新的平衡。所谓最小不平衡子树 指离插入节点最近且以平衡因子的绝对值大于1的节点作为根的子树。
- 问题2:红黑树的插入和删除?
问题2解决方案:
红黑树的插入,总是把插入的新元素的颜色设为红色,在插入过后极大可能会导致一系列操作以再次平衡红黑树。
红黑树的删除,与插入类似,删除一个元素后有极大可能需要一系列操作以再次平衡红黑树。
代码调试中的问题和解决过程
教材中代码调试有问题先去https://shimo.im/doc/1i1gldfsojIFH8Ip/看看,如果别人没有提出相同问题,可以编辑文档添加,然后把自己提出的问题复制到下面:
- 问题1:XXXXXX
- 问题1解决方案:XXXXXX
- 问题2:XXXXXX
- 问题2解决方案:XXXXXX
- ...
代码托管
(statistics.sh脚本的运行结果截图)
上周考试错题总结
- 错题1及原因,理解情况
- 错题2及原因,理解情况
- ...
结对及互评
- 本周结对学习情况
- 结对同学学号1
- 结对学习内容
- XXXX
- XXXX
...
其他(感悟、思考等,可选)
xxx
xxx
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 200/200 | 2/2 | 20/20 | |
第二周 | 300/500 | 2/4 | 18/38 | |
第三周 | 500/1000 | 3/7 | 22/60 | |
第四周 | 300/1300 | 2/9 | 30/90 |
参考资料
以上是关于20172325 2018-2019-2 《Java程序设计》第七周学习总结的主要内容,如果未能解决你的问题,请参考以下文章
20172325 2018-2019-2 《Java程序设计》第八周学习总结
20172325 学号 2017-2018-2 《程序设计与数据结构》实验二报告