2018-2019-20172321 《Java软件结构与数据结构》第七周学习总结
2018-2019-20172321 《Java软件结构与数据结构》第七周学习总结
教材学习内容总结
第11章 二叉查找树
一、概述
- 二叉查找树是一种含有附加属性的二叉树,该属性即其左孩子小于父节点,而父节点又小于等于其右孩子。如下图所示。根结点的左子树每个元素都小于80,右子树每个元素都大于80.

- 查找方法,要判定一个具体的目标是否存在于树中,需要沿着从根开始的路径,根据查找目标是小于还是大于当前结点的值,相应地转到当前结点的左子结点或右结点。最终或是找到目标元素,或是遇到路径的末端,后者意味着目标不在树中。
- 在二叉查找树中添加元素,改过程类似于树的查找过程,新元素添加为树的叶结点,从根开始,沿着每个结点中元素所确定的路径,直到相应地方向上没有子结点为止,此时,将新元素添加为叶结点。
如果没有其他操作,二叉查找树的树形由元素的添加顺序来决定。
- 注:如果输入是完全有序的,二叉查找树就会退化为一个有序链表,削弱了它本身的价值,如下图所示。

- 在二叉查找树中删除元素,要考虑如下三种情况(参考下图):

- 第一种情况:如果被删除的结点是叶结点(无子结点),可以简单地删除
- 第二种情况:如果被删除的结点是只有一个子结点,则用它的子结点替代它
- 第三种情况,如果被删除结点有两个子结点,在树的更低层找到一个合适的结点来代替它。被删除结点的子结点成为替代结点的子结点。
当从二叉查找树中删除有两个子结点的结点是,比较好的办法是用它的中序后继来取代它,即在中序遍历中排在被删元素之后的那个元素(紧邻的下一个值)
- 二叉查找树的接口类继承自二叉树的接口类BinaryTreeADT
public interface BinarySearchTreeADT<T> extends BinaryTreeADT<T>
{
public void addElement(T element);
//往树中添加一个元素
public T removeElement(T targetElement);
// 从树中删除一个元素
public void removeAllOccurrences(T targetElement);
// 从树中删除所指定元素的任何存在
public T removeMin();
//删除树中最小元素
public T removeMax();
// 删除树中最大元素
public T findMin();
//返回一个指向树中最小元素的引用
public T findMax();
//返回一个指向树中最大元素的引用
}
二、平衡二叉查找树
- 在平衡二叉树中进行查找,比在退化的树中进行查找的效率高很多。在有n个结点的平衡树中进行查找及添加操作的效率是进行O(log2 n)次比较(最长路径的长度)。树越退化,查找及添加操作的时间复杂度越接近O(n),它抵消了使用查找树带来的益处。
可以对二叉查找树进行旋转以恢复平衡
- 右旋转

1.令根的左子结点变为新的根
2.令原根结点变为新的根结点的右子结点
3.令原根的左子结点的右子结点变为原根结点的新的左子结点
- 左旋转

1.令根的右子结点变为新的根
2.令原根结点变为新的根结点的左子结点
3.令原根的右子结点的左子结点变为原根结点的新的右子结点
并非所有的不平衡情况都可以用一个单一的旋转解决,如果不平衡性是由根的右子结点的左子树的长路径引发的,则必须先绕那个异常子树执行一次右旋转,然后再绕根执行一次左旋转(右-左旋转)。如果不平衡是由根的左子结点的右子树中的长路径引发,则执行(左-右旋转)
三、AVL树
- AVL树是最先发明的自平衡二叉查找树。在AVL树中任何节点的两个子树的高度最大差别为一,所以它也被称为高度平衡树。查找、插入和删除在平均和最坏情况下都是O(log n)。增加和删除可能需要通过一次或多次树旋转来重新平衡这个树。
四、红黑树
- 红黑树(RBT)是具有以下性质的二叉查找树:
- 1.节点非红即黑。
- 2.根节点是黑色。
- 3.所有NULL结点称为叶子节点,且认为颜色为黑。
- 4.所有红节点的子节点都为黑色。
- 5.从任一节点到其叶子节点的所有路径上都包含相同数目的黑节点。

显然红黑树的平衡性能比AVL的略差些,但是经过大量试验证明,实际上红黑树的效率还是很不错了,仍能达到O(logN)
教材学习中的问题和解决过程
- 问题1:红黑树这东西插入都要把颜色变来变去的,删除怎么办啊
- 解决方法:
- 删除结点的左右子结点均为空,则将其直接删除即可;
- 删除结点的左右子结点其中一方为空,则将存在的那一方的子结点替代掉删除结点即可。
- 删除结点的左右子结点均不为空,首先选择该结点的替代结点(可以是其左子树中的最大值,也可以是其右子树中的最小值,可以肯定的是替代结点必然最多只有一个子结点),接着将替代结点替换掉删除结点,同时把删除结点删掉,删掉后的结果则分为好几种情况(下面的结点为替代替代结点后的结点):
- 结点为新的根,此时只是将所有的路径中都去除一个黑色结点,所以依然保持平衡;
- 结点的兄弟结点为红色;
- 结点的兄弟结点为黑色,同时其子结点也均为黑色;
- 结点的兄弟结点为黑色,同时兄弟结点的左子结点为红色,右子结点为黑色;
- 结点的兄弟结点为黑色,同时兄弟结点的右子结点为红色,左子结点为红色;
删除操作中真正被删除的必定是只有一个红色孩子或没有孩子的结点。
如果真正的删除点是一个红色结点,那么它必定是一个叶子结点。
代码调试中的问题和解决过程
在完成pp11.3的时候,一切都很顺利,但是在测试的时候报错了,然后不断追溯,发现是二叉查找树继承的之前的二叉树的tostring方法有问题,这就非常难受了,又乱七八糟改了半天才可以

代码托管

上周考试错题总结
没有测试
结对及互评
- 博客中值得学习的或问题:
- 优点:代码编写时遇到的问题记录非常详细;对书本上的内容理解也到位
- 缺点:没啥缺点,我觉得好的yipi。
- 本周结对学习情况
学习进度条
| 代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | |
|---|---|---|---|
| 目标 | 5000行 | 30篇 | 400小时 |
| 第一周 | 0/0 | 1/1 | 8/8 |
| 第二周 | 671/671 | 1/2 | 17/25 |
| 第三周 | 345/1016 | 1/3 | 15/40 |
| 第四周 | 405/1421 | 2/5 | 23/63 |
| 第五周 | 1202/2623 | 1/5 | 20/83 |
| 第六周 | 1741/4364 | 1/6 | 20/103 |
| 第七周 | 400/4764 | 1/7 | 20/123 |
参考资料
- 《Java软件结构与数据结构》第四版
- 完全树-学术百科-知网空间
- 完美二叉树, 完全二叉树和完满二叉树
2018-2019-20172321 《Java软件结构与数据结构》第七周学习总结的更多相关文章
- 20172328 2018—2019《Java软件结构与数据结构》第二周学习总结
20172328 2018-2019<Java软件结构与数据结构>第二周学习总结 概述 Generalization 本周学习了第三章集合概述--栈和第四章链式结构--栈.主要讨论了集合以 ...
- 20172328 2018-2019《Java软件结构与数据结构》第一周学习总结
20172328 2018-2019<Java软件结构与数据结构>第一周学习总结 概述 Generalization 本周学习了软件质量.数据结构以及算法分析的具体内容,主要依托于所用教材 ...
- 20172328 2018-2019《Java软件结构与数据结构》第九周学习总结
20172328 2018-2019<Java软件结构与数据结构>第九周学习总结 概述 Generalization 本周学习了无向图.有向图.带权图.常用的图算法.图的实现策略. 教材学 ...
- 2018-2019-20172329 《Java软件结构与数据结构》第九周学习总结
2018-2019-20172329 <Java软件结构与数据结构>第九周学习总结 教材学习内容总结 <Java软件结构与数据结构>第十五章-图 一.图及无向图 1.图的相关概 ...
- 2018-2019-20172321 《Java软件结构与数据结构》第九周学习总结
2018-2019-20172321 <Java软件结构与数据结构>第九周学习总结 教材学习内容总结 第15章 图 无向图 图由顶点和边组成. 顶点由名字或标号来表示,如:A.B.C.D: ...
- 《JAVA软件结构与数据结构》第一周学习总结
学号 20172326 <JAVA软件结构与数据结构>第一周学习总结 教材学习内容总结 软件质量的几大特性 增长函数与大O记法 大O记法用来表示表示增长函数,从而来表示算法的复杂度 算法的 ...
- 2018-2019-20172329 《Java软件结构与数据结构》第二周学习总结
2018-2019-20172329 <Java软件结构与数据结构>第二周学习总结 教材学习内容总结 <Java软件结构与数据结构>第三章 集合概述--栈 一.集合 1.我们印 ...
- 20172305 2018-2019-1 《Java软件结构与数据结构》第二周学习总结
20172305 2018-2019-1 <Java软件结构与数据结构>第二周学习总结 教材学习内容总结 本周内容主要为书第三章和第四章的内容: 第三章(以数组来替代栈的作用) 集合(聚集 ...
- 20172305 2018-2019-1 《Java软件结构与数据结构》第九周学习总结
20172305 2018-2019-1 <Java软件结构与数据结构>第九周学习总结 教材学习内容总结 本周内容主要为书第十五章内容: 图(结点和结点之间的连接构成) 顶点:结点 边:结 ...
- 20172329 2018-2019《Java软件结构与数据结构》第一周学习总结
2018-2019-20172329 <Java软件结构与数据结构>第一周学习总结 在这学期就已经大二了,也已经步入了学习专业课的核心时间,在这个阶段,我们应该了解自己的学习情况,针对自己 ...
随机推荐
- POJ 3468 A Simple Problem with Integers(线段树模板之区间增减更新 区间求和查询)
A Simple Problem with Integers Time Limit: 5000MS Memory Limit: 131072K Total Submissions: 140120 ...
- docker - kubernetes 网络(转)+ 架构图
1.host网络 连接到 host 网络的容器共享 Docker host 的网络栈,容器的网络配置与 host 完全一样.可以通过--network=host指定使用 host 网络.docker ...
- 文本处理三剑客之 sed
sed:文本流编辑器 主要是对文件的快速增删改查,查询功能中最常用的是过滤,取行 sed [选项] [sed内置命令字符] [输入文件] Options: -n:取消默认的sed输出,常与sed内置命 ...
- webdriver 获取页面response
在selenium webdriver实现自动化抓取数据过程中,发现无法从webdriver获取页面response 查来查去最终在 stackoverflow 上找到了这一篇文章 文章中说:webd ...
- 数据结构与算法之排序(4)希尔排序 ——in dart
研究了网上大部分的希尔排序代码,发现大部分都是互相抄的——因为网上甚至某些书上的实现大部分都是错的.希尔排序是插入排序的升级版,通过引入间隔,然后分组进行插入排序.再逐步缩小间隔,直至间隔为1时,做全 ...
- WP10的一点小问题
兼容WP8.0/WP7.5不太完整!也许是测试版的问题.毕竟还没发布正式版! 具体如:WP8.0或WP7.5的启动器!就是选择图片的启动器!调用后对话框返回的结果都是Cancel本来应该是OK的.也就 ...
- 20155217 2016-2017-2 《Java程序设计》第9周学习总结
20155217 2016-2017-2 <Java程序设计>第9周学习总结 教材学习内容总结 JBDC是用于执行SQL的解决方案,开发人员使用JDBC的标准接口,数据库厂商对接口直接操作 ...
- WPF不同线程之间的控件的访问
原文:WPF不同线程之间的控件的访问 WPF不同线程之间的控件是不同访问的,为了能够访问其他线程之间的控件,需要用Dispatcher.Invoke执行一个新的活动即可. 例如: public voi ...
- 使用Nginx+uWSGI+Django方法部署Django程序
第一步先解决uwsgi与django的桥接.解决在没有nginx的情况下,如何使用uwsgi+DJANGO来实现一个简单的WEB服务器. 第二步解决uwsgi与Nginx的桥接.通过nginx与uws ...
- Flutter - 下载别人的Flutter项目,本地编译不过
如果直接下载了别人的Flutter项目,点击运行基本会不通过的,这是gradle版本差异造成的. 你需要修改android/gradle/wrapper/gradle-wrapper.properti ...