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

20172319 2018.10.27-11.02

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

目录


教材学习内容总结

第十一章 二叉查找树

  • 11.1 概述:html

  • 二叉查找树(binary search tree) : 具备附加属性 的二叉树;即对于树中的每一个结点:左孩子小于父节点,父节点小于等于右孩子。
  • 二叉查找树的操做
  • 操做 说明
    addElement 往树中添加一个元素
    removeElement 从树中删除一个元素
    removeAllOccurrences 从树中删除所指定元素的任何存在
    removeMin 删除树中的最小元素
    removeMax 删除树中的最大元素
    findMin 返回一个指向树中最小元素的引用
    findMax 返回一个指向树中最大元素的引用
  • 11.2 用链表实现二叉查找树 前端

  • 11.2.1 addElement操做:git

  • 1.若树为空,新元素成为根结点;
  • 2.若树非空,新元素与树根元素进行比较:
  • (1)若其小于根结点存储的元素:
  • 若左孩子为空,新元素成为根的左孩子;若左孩子不为空,则遍历根的左孩子,再次进行比较操做。
  • (2)若其大于或等于根结点存储的元素:
  • 若右孩子为空,新元素成为根的右孩子;若右孩子不为空,则遍历根的右孩子,再次进行比较操做。数组

  • 11.2.2 removeElement操做:
    数据结构

  • 必需要推出 另外一个结点来代替要被删除的那个结点。
  • 用protected封装的replacement方法返回指向一个结点的引用,该结点将代替要删除的结点。
  • 选择替换结点的三种状况以下:
  • 1.若被删除结点无孩子,则replacement返回null;
  • 2.若被删除的结点只有一个右孩子,则replacement返回此孩子;
  • 3.若被删除的结点有两个孩子,则replacement返回中序遍历中的后继者。学习

  • 11.2.3 removeAllOccurrences操做:.net

  • 反复调用removeElement方法来删除某一指定元素的全部存在。设计

  • 11.2.4 removeMin操做:
    3d

  • 最小元素在二叉查找树中的三种可能情形:
  • 1.若根无左孩子,则其为最小元素,而其右结点会变成新的根结点;
  • 2.若树的最左侧结点是一片叶子,则这片叶子就是最小元素,只需设置其父节点的左孩子为null便可;
  • 3.若树的最左侧结点是一个内部结点,则须要设置其父结点的左孩子引用指向这个将删除结点的右孩子。调试

  • 11.3 用有序列表实现二叉查找树

  • 列表的一些常见操做:
  • 操做 描述
    removeFirst 从列表中删除第一个元素
    removeLast 从列表中删除最后一个元素
    remove 从列表中删除某个元素
    first 查看位于列表前端的元素
    last 查看位于列表末端的元素
    contains 肯定列表是否含有某一个元素
    isEmpty 断定列表是否为空
    size 肯定列表中的元素数量
  • 有序列表的特有操做:
  • 操做 描述
    add 向列表中添加一个元素
  • 11.3.1 BinarySearchTree实现的分析:

  • 在BinarySearchTreeList实现中用到的LinkedBinarySearchTree实现是一种具备附加属性的平衡二叉查找树;
  • 附加属性:假设树中存储的元素数目是n,则任何结点的最大深度为log2n
  • 有序列表的链表实现分析和二叉查找树实现分析:
  • 操做 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操做均可能致使树变得不平衡
  • 11.4 平衡二叉查找树
  • 只有保持平衡,二叉树的查找效率才会高。
  • 实现目的:保持树的最大路径长度趋近于:log2n
  • 锐化树(degenerate tree)
  • 其看起来更像是一个链表,然而其效率却比链表还低,其附带了额外的开销。

  • 若无平衡假设,则最坏状况下addElement操做的时间复杂度为O(n)而不是O(log n),树根是最小元素,而即将被插入的元素可能成为树中的最大元素。

  • 11.4.1 右旋(right rotation):
  • 左孩子绕着其父结点向右旋转;

  • 旋转前,x是p的左儿子。x的右儿子(若存在)变为p的左儿子,p变为x的右儿子。

  • 11.4.2 左旋(left rotation):
  • 右孩子绕着其父结点向左旋转;
  • 旋转前,x是p的右儿子。x的左儿子(若存在)变为p的右儿子,p变为x的左儿子。

  • 许多时候,一棵不平衡树要趋近平衡所须要的旋转不止一次。
  • 11.4.3 右左旋(rightleft rotation):

  • 11.4.3 左右旋(leftright rotation):

  • 11.5 实现二叉查找树:AVL树

  • 一种高度平衡的二叉查找树,其能尽量地下降树的高度,以此减小树的平均查找长度。
  • 性质:
  • 1.左右子树高度差的绝对值不超过1 ;
  • 2.树中的每一个子树都是AVL树;
  • 3.每一个节点都有一个平衡因子(balance factor),任一节点的平衡因子是-1,0,1。(每一个节点的平衡因子等于右子树的高度减去左子树的高度 )

  • 11.6 实现二叉查找树:红黑树

返回目录


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

  • 问题1:2-3-4树?
  • 解决:

返回目录


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

  • 问题1:如何删除某一指定结点的子树。

  • 解决:

返回目录


代码托管

返回目录


上周考试错题总结

  • 错题1:

  • 解决: 应是父结点小于等于右孩子。
  • 错题2:

  • 解决:O(nlog(n))的变化速度最慢。
  • 错题3:

  • 解决:二分查找利用的是查找池已排序这一事实。
  • 错题4:

  • 解决:二分查找利用的是查找池已排序这一事实。

返回目录


结对及互评

点评过的同窗博客和代码

  • 本周结对学习状况
    • 20172316赵乾宸
    • 博客中值得学习的或存在问题:
    • 20172329王文彬
    • 博客中值得学习的或存在问题:
    • 博客内容充实、排版整齐、对教材内容有通过一番认真思考、继续保持。
    • 代码截图作标注时应尽可能避免遮挡代码。
    • Markdown的部分缩进有误。
    • 教材问题2提出得很好,能够看出近断时间来反复使用链表、数组去实现同一类型的数据结构起得了必定的成效。

返回目录


学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积)
目标 3000行 15篇 300小时
第一周 0/0 1/1 12/12
第二周 935/935 1/2 24/36
第三周 849/1784 1/3 34/70
第四周 3600/5384 1/5 50/120
第五周 2254/7638 1/7 50/170
第六周 2809/10447 1/9 45/215
第七周 3700/14147 1/10 40/255

返回目录


参考资料

相关文章
相关标签/搜索