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:红黑树这东西插入都要把颜色变来变去的,删除怎么办啊
  • 解决方法:
    • 删除结点的左右子结点均为空,则将其直接删除即可;
    • 删除结点的左右子结点其中一方为空,则将存在的那一方的子结点替代掉删除结点即可。
    • 删除结点的左右子结点均不为空,首先选择该结点的替代结点(可以是其左子树中的最大值,也可以是其右子树中的最小值,可以肯定的是替代结点必然最多只有一个子结点),接着将替代结点替换掉删除结点,同时把删除结点删掉,删掉后的结果则分为好几种情况(下面的结点为替代替代结点后的结点):
    1. 结点为新的根,此时只是将所有的路径中都去除一个黑色结点,所以依然保持平衡;
    2. 结点的兄弟结点为红色;
    3. 结点的兄弟结点为黑色,同时其子结点也均为黑色;
    4. 结点的兄弟结点为黑色,同时兄弟结点的左子结点为红色,右子结点为黑色;
    5. 结点的兄弟结点为黑色,同时兄弟结点的右子结点为红色,左子结点为红色;

删除操作中真正被删除的必定是只有一个红色孩子或没有孩子的结点。

如果真正的删除点是一个红色结点,那么它必定是一个叶子结点。

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

在完成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

参考资料

2018-2019-20172321 《Java软件结构与数据结构》第七周学习总结的更多相关文章

  1. 20172328 2018—2019《Java软件结构与数据结构》第二周学习总结

    20172328 2018-2019<Java软件结构与数据结构>第二周学习总结 概述 Generalization 本周学习了第三章集合概述--栈和第四章链式结构--栈.主要讨论了集合以 ...

  2. 20172328 2018-2019《Java软件结构与数据结构》第一周学习总结

    20172328 2018-2019<Java软件结构与数据结构>第一周学习总结 概述 Generalization 本周学习了软件质量.数据结构以及算法分析的具体内容,主要依托于所用教材 ...

  3. 20172328 2018-2019《Java软件结构与数据结构》第九周学习总结

    20172328 2018-2019<Java软件结构与数据结构>第九周学习总结 概述 Generalization 本周学习了无向图.有向图.带权图.常用的图算法.图的实现策略. 教材学 ...

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

    2018-2019-20172329 <Java软件结构与数据结构>第九周学习总结 教材学习内容总结 <Java软件结构与数据结构>第十五章-图 一.图及无向图 1.图的相关概 ...

  5. 2018-2019-20172321 《Java软件结构与数据结构》第九周学习总结

    2018-2019-20172321 <Java软件结构与数据结构>第九周学习总结 教材学习内容总结 第15章 图 无向图 图由顶点和边组成. 顶点由名字或标号来表示,如:A.B.C.D: ...

  6. 《JAVA软件结构与数据结构》第一周学习总结

    学号 20172326 <JAVA软件结构与数据结构>第一周学习总结 教材学习内容总结 软件质量的几大特性 增长函数与大O记法 大O记法用来表示表示增长函数,从而来表示算法的复杂度 算法的 ...

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

    2018-2019-20172329 <Java软件结构与数据结构>第二周学习总结 教材学习内容总结 <Java软件结构与数据结构>第三章 集合概述--栈 一.集合 1.我们印 ...

  8. 20172305 2018-2019-1 《Java软件结构与数据结构》第二周学习总结

    20172305 2018-2019-1 <Java软件结构与数据结构>第二周学习总结 教材学习内容总结 本周内容主要为书第三章和第四章的内容: 第三章(以数组来替代栈的作用) 集合(聚集 ...

  9. 20172305 2018-2019-1 《Java软件结构与数据结构》第九周学习总结

    20172305 2018-2019-1 <Java软件结构与数据结构>第九周学习总结 教材学习内容总结 本周内容主要为书第十五章内容: 图(结点和结点之间的连接构成) 顶点:结点 边:结 ...

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

    2018-2019-20172329 <Java软件结构与数据结构>第一周学习总结 在这学期就已经大二了,也已经步入了学习专业课的核心时间,在这个阶段,我们应该了解自己的学习情况,针对自己 ...

随机推荐

  1. 404 Note Found队 福大助手项目测评

    目录 第一部分 调研,评测 福大助手的bug IOS端 Android端 福大助手结构体系的思维导图 为什么开发人员没有发现这个bug 假设团队开发这款app,应注意哪些方面(架构.部署运维.微服务等 ...

  2. PHPCMS v9 手机版如何设置独立域名

    一.在PHPcms V9管理后台设置手机门户(目前phpcms v9 版本为V9.6.3) 1.1.开启手机网站.位置:模块 >手机门户 > 添加手机站点,具体设置可参照截图: 填写站点名 ...

  3. Dll中调用dcpcrypt

    可先在EXE中加入控件来参考,如要导出给其它语言调用参数得用PChar,XE以上的估计得再调整,待实用时再测试 如下代码在2007中可直接导出使用 uses Windows, SysUtils, DC ...

  4. JavaEE笔记(八)

    第一个Spring Student(学生) bean package com.my.bean; import java.io.Serializable; public class Student im ...

  5. 【BZOJ1047】[HAOI2007]理想的正方形

    [BZOJ1047][HAOI2007]理想的正方形 题面 bzoj 洛谷 题解 二维\(st\)表,代码是以前的 #include<iostream> #include<cstdi ...

  6. 最新版CocoaPods的安装和使用以及版本升级遇到的问题

    CocoaPods的下载及安装 mac系统已经默认安装好Ruby环境,如果你不确定自己系统中是否有Ruby的,可以在终端中输入命令行:ruby -v查看当前ruby版本.如图:  确定以后,接下来就可 ...

  7. angularJs中缓存数据,免去重复发起请求的几种写法

    带缓存处理的两种写法 过程:点击button触发load()方法,请求数据成后显示到页面中.如果已经请求过则从缓存中读取. 在线浏览 写法1: function demo(){ if (demo.ca ...

  8. Python_sklearn机器学习库学习笔记(四)decision_tree(决策树)

    # 决策树 import pandas as pd from sklearn.tree import DecisionTreeClassifier from sklearn.cross_validat ...

  9. 第二章:走进shell

    2.2 通过Linux控制台终端访问CLI(command line interface) 打开CLI:control+alt+t   用于设置前景色和背景色的setterm选项 选项 参数 描述 - ...

  10. P1402 酒店之王

    P1402 酒店之王 每个人要匹配一个A和一个B,所以这样连边: S向每个房间连边. 每个房间向喜欢这个房间的人连边. 每个人向喜欢的菜连边. 每道菜向T连边. 边权均为1. 注意人要限流. // I ...