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:

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

代码托管

上周考试错题总结

没有测试

结对及互评

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积)
目标 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

参考资料

原文地址:https://www.cnblogs.com/N-idhogg/p/9894910.html

时间: 2024-08-02 02:48:37

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

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

20172305 2018-2019-1 <Java软件结构与数据结构>第一周学习总结 教材学习内容总结 本周内容主要为书第一章和第二章的内容: 第一章 软件质量: 正确性(软件达到特定需求的程度) 可靠性(软件发生故障的频率和危害程度) 健壮性(很好处理错误情况的情况) 可用性(用户在软件中掌握和运行任务的容易程度) 可维护性(软件进行修改的容易程度) 可重用性(软件组件可被其他软件系统开发使用的容易程度) 可移植性(软件组成可用于多种计算机环境中的容易程度) 运行效率(不浪费资源的情况下软

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

2018-2019-20172321 <Java软件结构与数据结构>第九周学习总结 教材学习内容总结 第15章 图 无向图 图由顶点和边组成. 顶点由名字或标号来表示,如:A.B.C.D: 边由连接的顶点对来表示,如:(A,B),(C,D),表示两顶点之间有一条边. 无向图:与树类似,图也由结点和这些结点之间的连接构成.这些结点是顶点,而结点之间的链接是边.无向图是一种边为无序结点对的图.于是,记做(A,B)的边就意味着A与B之间有一条从两个方向都可以游历的连接.边记作(A,B)和记作(B,A

20172321 《程序设计与数据结构》第一周学习总结

20172321 <程序设计与数据结构>第一周学习总结 教材学习内容总结 第一章 概述 1.1 软件质量 软件工程是一门关于高质量软件开发的技术和理论的学科. 高质量软件的特征 1.2 数据结构 数据结构是计算机存储.组织数据的方式. 数据结构是指相互之间存在一种或多种特定关系的数据元素的集合.通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率. 常用结构 第二章 2.1 算法效率分析 算法效率通常用==CPU的使用时间==表示 算法分析是从效率的角度对算法进行分类 2.2 增长函数

201871010104-陈园园 《面向对象程序设计(java)》第六——七周学习总结

201871010104-陈园园 <面向对象程序设计(java)>第六——七周学习总结 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业要求在哪里 https://www.cnblogs.com/lily-2018/p/11441372.html 作业学习目标 (1) 理解继承的定义: (2) 掌握子类的定义要求 (3) 掌握多态性的概念及用法: (4) 掌握抽象类的定义及用途. 第一部分:总结理论知识 1.类.超类和子类: a

20172306 2018-2019 《Java程序设计与数据结构》第一周学习总结

20172306 2018-2019 <Java程序设计与数据结构(下)>第一周学习总结 教材学习内容总结 第一章 概述 (程序=数据结构+算法 软件=程序+软件工程) 1.1 软件质量 软件工程师一门关于高质量软件开发的技术和理论的学科 软件工程的目标:1.解决正确性问题 2.按时且在预算之内给出解决方案 3.给出高质量的解决方案 4.以合情合理的方式完成上面的事情 高质量软件的特征 正确性:我认为是我们所做的都是为了解决一个正确性问题. 可靠性:降低软件的故障程度和概率 健壮性:可以很好地

20172306《Java程序设计与数据结构》第九周学习总结

20172306<Java程序设计>第九周学习总结 教材学习内容总结 第十一章: try-catch语句.其中还有finally语句.try是进行某些操作,catch是捕获异常,并通过某些异常来进行某些操作.finally是无论是否有异常都会进行的语句.可以没有catch语句. 异常的传递.我觉得传递,主要是某地方的异常是由其他的方法引起的,异常就会传递到那个方法上.书中的例子可以很好的表现出来. IO异常.书中的内容主要是围绕异常来写.老师在蓝墨云中有写有关IO更为详细的内容.例如创建文件,

20172302 《Java软件结构与数据结构》第四周学习总结

2018年学习总结博客总目录:第一周 第二周 第三周 第四周 教材学习内容总结 第六章 列表 1.列表是对象的有序集合,在 List 界面中定义. List 接口表示集合框架中的列表.列表可以具有重复的元素.并且我们可以在列表中存储多个空值. 2.列表集合 是一种概念性的表示方法,其思想是使事物以线性列表的方式进行组织,就像栈和队列一样,列表也可以使用数组和链表来实现.列表集合没有内在的容量大小,它可以随着需要而增大.列表集合更一般化,可以在列表的中间和末端添加和删除元素. 3.列表可以分为有序

20172308《Java软件结构与数据结构》第四周学习总结

教材学习内容总结 第 6 章 列表 一. 列表集合 列表集合:一种概念性表示法,思想是使事物以线性列表的方式进行组织 特点: 列表集合没有内在的容量大小,它可以随着需要而增大 列表集合更具一般化,可以在列表的中间和末端添加和删除元素 列表也可以使用链表或数组实现 类型: 有序列表:元素按照元素的某种内在特性进行排序 无序列表:元素间不具有内在顺序,元素按照它们在列表中的位置排序 索引列表:其元素可以用数字索引来引用(顺序由使用者决定) 二. Java API没有任何类能直接实现以上描述的有序列表

《JAVA程序设计》_第七周学习总结

一.学习内容 1.String类 2.StringTokenizer类 3.Scanner类——8.3知识 4.StringBuffer类——8.4知识 5.Date与Calendar类——8.5知识 (1) Date类 (2)Calendar类 6.日期的格式化——8.6知识 8.6.1 format方法 8.6.2 不同区域的星期格式 7.Math类.BigInteger类和Random类——8.7知识 8.7.1 Math类 8.7.3 Random类 8.数字格式化——8.8知识 8.8

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

教材学习内容总结 第五章 5.1概述 队列是一种线性集合,其元素从一端加入,从另一端删除:队列的处理方式是先进先出(First in First out). 与栈的比较(LIFO) 栈是一端操作,先进后出 队列是两端操作,先进先出 栈的一些操作 操作 描述 enqueue 向队列末端添加一个元素 dequeue 从队列前端删除一个元素 first 考察队列前端的那个元素 isEmpty 判定队列是否为空 size 判定队列中的元素数目 toString 返回队列中的字符串表示 5.2javaAP