2018-2019-20172329 《Java软件结构与数据结构》第七周学习总结

时间:2018-11-02 22:44:45   收藏:0   阅读:158

2018-2019-20172329 《Java软件结构与数据结构》第七周学习总结

教材学习内容总结

《Java软件结构与数据结构》第十一章-二叉查找树

一、概述

操作 描述
addElement 往树中添加一个元素
removeElement 从书中删除一个元素素
removeAllOccurrences 从树中删除所指定元素的任何存在
removeMin 删除树中的最小元素
removeMax 删除树中的最大元素
findMin 返回一个指向树中最小元素的引用
findMax 返回一个指向树中最大元素的引用

二、用链表实现二叉查找树

三、用有序列表实现二叉查找树

操作 LinkedList BinarySearchTreeList
removeFirst O(1) O(log n)
removeLast O(n) O(log n)
remove O(n) O(log n)*
first O(1) O(log n)
last O(n) O(log n)
contains O(n) O(log n)
isEmpty O(1) O(1)
size O(1) O(1)
add O(n) O(log n)*

注:*add操作和remove操作都可能导致树变的不平衡

四、平衡二叉树

教材学习中的问题和解决过程

(2)我们了解到在某种程度上,红黑树中的平衡限制没有AVL树那样的严格。但是,它们的序仍旧是log n。

(3)我们分析一下红黑树的时间复杂度:

(4)红黑树中元素插入:
将一个节点插入到红黑树中,需要执行哪些步骤呢?首先,将红黑树当作一颗二叉查找树,将节点插入;然后,将节点着色为红色;最后,通过旋转和重新着色等方法来修正该树,使之重新成为一颗红黑树。详细描述如下:

1、第一步: 将红黑树当作一颗二叉查找树,将节点插入。
红黑树本身就是一颗二叉查找树,将节点插入后,该树仍然是一颗二叉查找树。也就意味着,树的键值仍然是有序的。此外,无论是左旋还是右旋,若旋转之前这棵树是二叉查找树,旋转之后它一定还是二叉查找树。这也就意味着,任何的旋转和重新着色操作,都不会改变它仍然是一颗二叉查找树的事实。
好吧?那接下来,我们就来想方设法的旋转以及重新着色,使这颗树重新成为红黑树!

2、第二步:将插入的节点着色为"红色"。
为什么着色成红色,而不是黑色呢?为什么呢?在回答之前,我们需要重新温习一下红黑树的特性:

(1) 每个节点或者是黑色,或者是红色。

(2) 根节点是黑色。

(3) 每个叶子节点是黑色。 [注意:这里叶子节点,是指为空的叶子节点!]

(4) 如果一个节点是红色的,则它的子节点必须是黑色的。

(5) 从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点。
将插入的节点着色为红色,不会违背"特性(5)"!少违背一条特性,就意味着我们需要处理的情况越少。接下来,就要努力的让这棵树满足其它性质即可;满足了的话,它就又是一颗红黑树了。o(∩∩)o...哈哈

3、第三步: 通过一系列的旋转或着色等操作,使之重新成为一颗红黑树。
第二步中,将插入节点着色为"红色"之后,不会违背"特性(5)"。那它到底会违背哪些特性呢?
对于"性质(1)",显然不会违背了。因为我们已经将它涂成红色了。
对于"性质(2)",显然也不会违背。在第一步中,我们是将红黑树当作二叉查找树,然后执行的插入操作。而根据二叉查找数的特点,插入操作不会改变根节点。所以,根节点仍然是黑色。
对于"性质(3)",显然不会违背了。这里的叶子节点是指的空叶子节点,插入非空节点并不会对它们造成影响。
对于"性质(4)",是有可能违背的!
那接下来,想办法使之"满足特性(4)",就可以将树重新构造成红黑树了。
技术分享图片

(5)红黑树中元素删除:
-(1)重新平衡化(及重新着色):删除元素之后进行这一操作,是一种迭代过程,从删除点开始,一直上溯到树根。因此,如前所述,实现红黑树时最好在各个结点中包含一个父结点引用。这一过程的终止条件是(current==root)或(current.color==red),其中current是我们正在处理的这个结点。

代码调试中的问题和解决过程

代码链接

技术分享图片
技术分享图片

上周考试错题总结

测试还没有结束

结对及互评

  1. 正确使用Markdown语法(加1分):
  2. 模板中的要素齐全(加1分)
  3. 教材学习中的问题和解决过程, 一个问题加1分
  4. 代码调试中的问题和解决过程, 一个问题加1分

  1. 正确使用Markdown语法(加1分):
  2. 模板中的要素齐全(加1分)
  3. 教材学习中的问题和解决过程, 一个问题加1分
  4. 代码调试中的问题和解决过程, 一个问题加1分

感悟

这一周很显然的感觉到自己时间很不够用,可能自己对于时间的分配还是有些不合理,总是做了些浪费时间的事情,也发现自己现在的时间观念没有过去那样很强了,希望自己可以经常反省,自己为什么会做事越来越慢。

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积)
目标 5000行 30篇 400小时
第一周 0/0 1/1 6/6
第二周 1313/1313 1/2 20/26
第三周 901/2214 1/3 20/46
第四周 3635/5849 2/4 20/66
第五周 1525/7374 1/5 20/86
第六周 1542/8869 2/5 25/111
第七周 1391/10260 1/6 20/131

参考资料

蓝墨云班课
Java程序设计
红黑树之原理和算法实现
java中instanceof的用法和实战
AVL树(平衡二叉树)
AVL树算法思想和代码实现
AVL树的旋转图解和简单实现

原文:https://www.cnblogs.com/qh45wangwenbin/p/9893609.html

评论(0
© 2014 bubuko.com 版权所有 - 联系我们:wmxa8@hotmail.com
打开技术之扣,分享程序人生!