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。
  • 本周结对学习情况
    • 20172324

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积)
目标 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软件结构与数据结构》第四版
  • 完全树-学术百科-知网空间
  • 完美二叉树, 完全二叉树和完满二叉树

转载于:https://www.cnblogs.com/N-idhogg/p/9894910.html

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

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

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

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

    2018-2019-20172321 <Java软件结构与数据结构>第四周学习总结 教材学习内容总结 第六章 6.1列表集合 列表集合是一种概念性表示法,其思想是使事物以线性列表的方式进行 ...

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

    一.学习内容 1.String类--8,1知识 Java专门提供了用来处理字符序列的String类.String类在java.lang包中,由于java.lang包中的类被默认引入,因此程序可以直接使 ...

  4. 数据结构java 图实验代码_20172329 2018-2019 《Java软件结构与数据结构》实验三报告...

    20172329 2018-2019-2 <Java软件结构与数据结构>实验三报告 课程:<Java软件结构与数据结构>html 班级: 1723java 姓名: 王文彬lin ...

  5. java数组的声明学号姓名线性结构_20172302 《Java软件结构与数据结构》实验一:线性结构实验报告...

    课程:<Java软件结构与数据结构> 班级: 1723 姓名: 侯泽洋 学号:20172302 实验教师:王志强老师 实验日期:2018年9月26日 必修/选修: 必修 实验内容 (1)链 ...

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

    20172328 2018-2019<Java软件结构与数据结构>第八周学习总结 概述 Generalization 本周学习了二叉树的另一种有序扩展?是什么呢?你猜对了!ヾ(◍°∇°◍) ...

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

    20172305 2018-2019-1 <Java软件结构与数据结构>第六周学习总结 教材学习内容总结 本周内容主要为书第十章内容: 树(一种非线性结构,其中的元素被组织成一个层次结构) ...

  8. 20172304 《程序设计与数据结构》第九周学习总结

    20172304 <程序设计与数据结构>第九周学习总结 教材学习内容总结 本章是第十五章,主要介绍了图的概念. 首先我来介绍一下图的基本结构. 从逻辑上讲,图是由边和结点组成的,在我的理解 ...

  9. 20172332 2017-2018-2 《程序设计与数据结构》第七周学习总结

    20172332 2017-2018-2 <程序设计与数据结构>第七周学习总结 教材学习内容总结 第十一章 二叉查找树 1.二叉查找树:一种带有附加属性的二叉树.即每个结点其左孩子都要小于 ...

最新文章

  1. 【J2EE】第四章 SpringMVC
  2. Linux 下五款出色的流媒体客户端
  3. Tomcat7启动报Error listenerStart错误--转载
  4. Python开发基础----异常处理、socket套接字基础1
  5. MySQL查询连接数
  6. cesium进行模型高度测量的代码片段
  7. oracle 设置忽略关键字,记oracle里continue关键字的陷阱
  8. Haystack-全文搜索框架
  9. 《Unix网络编程卷1:套接字联网API》读书笔记
  10. 周鸿祎:有的人在25岁时就死了,但在75岁时才被埋葬
  11. Early Stopping早停法
  12. ArcGIS TIN地表面与栅格地表面的生成与互相转换
  13. 使用应用心理学帮助软件工程师
  14. 关于添加文件删除权限
  15. shp地图如何导入奥维地图手机_如何将CAD图导入到手机版奥维互动地图
  16. 截止失真放大电路_音频放大器结构组成_音频放大器分类
  17. CAD教程:CAD自定义菜单和工具栏的操作技巧
  18. 美丽的诗句 撩妹首选哦!
  19. 微信小程序获取用户信息后的解密操作
  20. python 蒙特卡罗_python实现蒙特卡罗方法教程

热门文章

  1. 解决Cocos2d-x编写Windows游戏时创建项目的困难
  2. JAVA后台Controller/servlet如何获取到从前端传来的参数
  3. 微软又放大招!网友:这也太猛了...
  4. 【豪威科技】Omnivision简称OV专业开发高度集成CMOS影像技术
  5. h5页面怎么处理文件流_H5基础开发流程
  6. 要闻君说:重磅!阿里巴巴发布了机器学习平台PAI 3.0版本;厉害!三星推出了业界首款HBM2E内存;Google也做云游戏平台...
  7. Spring注解@Qualifier的详细用法你知道几种「扩展点实战系列」- 第444篇
  8. 四大里snr是什么职位_四大职位等级剖析,内部结构原来是这样的
  9. 企业微信第三方应用-下载excel(vue)
  10. “珞珈振翅•诚信翱翔”中诚信征信2019年武大校招火爆开篇