20172303 2018-2019-1《程序设计与数据结构》第7周学习总结

20172303 2018-2019-1《程序设计与数据结构》第7周学习总结

教材学习内容总结

本周在上周学习了二叉树的基础上,学习了一种二叉树的特殊形式——二叉查找树,又叫有序二叉树、排序二叉树。本章学习了两种二叉查找树的实现方法,以及两种二叉查找树的应用。

一、概述

1.二叉查找树

  • 概念:树中的所有结点,其左孩子都小于父结点,父结点小于或等于其右孩子。
  • 性质:
    • 任意结点的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
    • 任意结点的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
    • 任意结点的左、右子树也分别为二叉查找树;
    • 没有元素相等的结点。

2.二叉查找树ADT

  • 二叉查找树的ADT是上一章中讨论的二叉树的扩展,其中的操作是二叉树中已定义的那些操作的补充。
  • 二叉查找树中的操作:
    • addElement:向树中添加一个元素
    • removeElement:从树中删除一个元素
    • removeAllOccurrences:从树中删除所指定元素的任何存在
    • removeMin:删除树中的最小元素
    • removeMax:删除树中的最大元素
    • findMin:返回树中的最小元素的引用
    • findMax:返回树中的最大元素引用

二、二叉查找树的实现

1.查找

  • 二叉查找树的查找方法与二分查找类似,将所要查找的元素与根结点的元素进行比较,如果小于根结点则继续与左孩子对比,大于根结点则继续与右孩子对比,如果相等则返回元素。实现方法有迭代和递归两种。
  • 迭代实现
public void find(T element)
{
    T result = null;
    BinaryTreeNode node = root;
    while (node != null)
    {
 
        if (element.CompareTo(node.getElement) > 0)
        {
            node = node.right;
        }
        else if (element.CompareTo(node.getElement) < 0)
        {
            node = node.left;
        }
        else
        {
            result = node.getElement;
            break;
        }
    }
    return result;
}
  • 递归实现
public void find(T element)
{
    return find(root, element);
}
 
private void find(BinaryTreeNode root, T element)
{
    if (root == null) {
        return element;
    }
    
    int comparable = element.CompareTo(root.getElement);
    if (comparable > 0){
        find(root.right,element);
    }
    else if (comparable < 0){
        find(root.left,element);
    }
    else {
        return root.getElement;
    }
}

2.插入

  • 进行插入的操作有三种情况:
    • 若当前的二叉查找树为空,加入的元素会成为根结点。
    • 若所插入结点的元素小于根结点的元素:
      • 若根的左孩子为null,插入结点将会成为新的左孩子。
      • 若根的左孩子不为null,则会继续对左子树进行遍历,遍历的同时进行比较操作。
    • 若所插入结点的元素大于或等于根结点的元素
      • 若根的右孩子为null,插入结点将会成为新的右孩子。
      • 若根的右孩子不为null,则会继续对右子树进行遍历,遍历的同时进行比较操作。

3.删除

  • 二叉查找树的删除操作是所有操作中最为复杂的,我们先来考虑一种特殊情况:所删除的元素是树中的最大值或最小值
(1)特殊情况:所删除元素为树中的最大值或最小值
  • 由于二叉查找树的特殊形式,其最小值一般位于树的左子树,最大值位于树的右子树。两者的删除方法是类似的,唯一不同的地方就是“左”和“右”,下面我们以删除最大值为例来说明,删除最小值的情况只要把例子中的“左”和“右”交换一下即可。
  • 删除最大值有三种情况:
    • 情况一:若根结点没有右孩子,那么根结点的元素就为最大元素,原树根的左孩子则会变成新的根结点。
    • 情况二:若最大值的结点是一个叶子结点,那么直接将其父结点的右孩子的引用设置为null即可。
    • 情况三:若最大值的结点是一个中间结点,则需要设置其父结点的右孩子的引用为该结点的左孩子。
(2)正常情况
  • 正常情况下删除元素也有三种情况,但这三种情况就不是那么简单了。
  • 情况一

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

  • 问题1:
  • 问题1解决方案:
  • 问题2:
  • 问题2解决方法:
  • 问题3:
  • 问题3解决方法:

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

  • 问题1:
  • 问题1解决方法:
  • 问题2:
  • 问题2解决方法:

代码托管

上周考试错题总结(正确为绿色,错误为红色)

  • 错题1:The Java Collections API contains _________ implementations of an indexed list.
    • A .Two
    • B .Three
    • C .Four
    • D .Five
  • 错题1解决方法:我本来理解的是Java API中提供了几种方法来实现列表,因此选择两种因为一种是ArrayList另一种是LinkedList。后来发现是自己看错题了没有看到“索引”两个字,原话在书上120页。
  • 错题2:The elements of an unordered list are kept in whatever order the client chooses.
    • A .True
    • B .False
  • 错题2解决方法:当时做题的时候想的是无序列表的顺序确实是由使用者来决定的啊,后来想想错误可能出在”whatever"上了。

结对及互评

点评模板:

  • 博客中值得学习的或问题:
    • 优点:本周的博客大有长进!内容丰富了很多,终于做到了图文并茂,值得夸奖!
    • 问题:图片的排版还需加强。
  • 代码中值得学习的或问题:
    • 优点:提了几周的commit提交终于有所改进,感觉这周我的搭档有了质的飞跃。可能是一遍遍的吐槽起了作用,果然像马原老师说的一样,量变会引起质变!
    • 问题:本周代码的备注不是很多。

      点评过的同学博客和代码

  • 本周结对学习情况
    • 20172322
    • 结对学习内容
      • 给我讲解了课堂实验ASL计算的方法。
      • 主要探讨了归并排序的计数方法。

其他(感悟、思考等,可选)

  • 因为跳啦啦操的缘故感觉最近的课程总是要落大家一些,现在啦啦操跳完了要赶紧追上大家ヾ(◍°∇°◍)ノ゙

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时
第一周 10/10 1/1 10/10
第二周 246/366 2/3 20/30
第三周 567/903 1/4 10/40
第四周 2346/3294 2/6 20/60
第五周 1343/4637 2/8 30/90
第六周 1343/4637 2/8 30/90
第七周 1343/4637 2/8 30/90
  • 计划学习时间:20小时

  • 实际学习时间:30小时

  • 改进情况:本周的大部分时间基本都花在了对于查找算法和排序算法的理解上了,感觉对时间复杂度理解和计算的应用变得更加熟练了。

参考资料

猜你喜欢

转载自www.cnblogs.com/PFrame/p/9898934.html