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

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

教材学习内容总结

第11章 二叉查找树

1、概述

  • 二叉查找树是一种含有附加属性的二叉树,该属性即其左孩子小于父节点,而父节点又小于等于其右孩子。以下图所示。根结点的左子树每一个元素都小于80,右子树每一个元素都大于80.

  • 查找方法,要断定一个具体的目标是否存在于树中,须要沿着从根开始的路径,根据查找目标是小于仍是大于当前结点的值,相应地转到当前结点的左子结点或右结点。最终或是找到目标元素,或是遇到路径的末端,后者意味着目标不在树中。
  • 在二叉查找树中添加元素,改过程相似于树的查找过程,新元素添加为树的叶结点,从根开始,沿着每一个结点中元素所肯定的路径,直到相应地方向上没有子结点为止,此时,将新元素添加为叶结点。html

    若是没有其余操做,二叉查找树的树形由元素的添加顺序来决定。java

  • 注:若是输入是彻底有序的,二叉查找树就会退化为一个有序链表,削弱了它自己的价值,以下图所示。git

  • 在二叉查找树中删除元素,要考虑以下三种状况(参考下图):

  • 第一种状况:若是被删除的结点是叶结点(无子结点),能够简单地删除
  • 第二种状况:若是被删除的结点是只有一个子结点,则用它的子结点替代它
  • 第三种状况,若是被删除结点有两个子结点,在树的更低层找到一个合适的结点来代替它。被删除结点的子结点成为替代结点的子结点。数据结构

    当从二叉查找树中删除有两个子结点的结点是,比较好的办法是用它的中序后继来取代它,即在中序遍历中排在被删元素以后的那个元素(紧邻的下一个值)性能

  • 二叉查找树的接口类继承自二叉树的接口类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();
    //返回一个指向树中最大元素的引用
}

2、平衡二叉查找树

  • 在平衡二叉树中进行查找,比在退化的树中进行查找的效率高不少。在有n个结点的平衡树中进行查找及添加操做的效率是进行O(log2 n)次比较(最长路径的长度)。树越退化,查找及添加操做的时间复杂度越接近O(n),它抵消了使用查找树带来的益处。学习

    能够对二叉查找树进行旋转以恢复平衡测试

  • 右旋转3d

1.令根的左子结点变为新的根
 2.令原根结点变为新的根结点的右子结点
 3.令原根的左子结点的右子结点变为原根结点的新的左子结点
  • 左旋转

1.令根的右子结点变为新的根
 2.令原根结点变为新的根结点的左子结点
 3.令原根的右子结点的左子结点变为原根结点的新的右子结点

并不是全部的不平衡状况均可以用一个单一的旋转解决,若是不平衡性是由根的右子结点的左子树的长路径引起的,则必须先绕那个异常子树执行一次右旋转,而后再绕根执行一次左旋转(右-左旋转)。若是不平衡是由根的左子结点的右子树中的长路径引起,则执行(左-右旋转)调试

3、AVL树

  • AVL树是最早发明的自平衡二叉查找树。在AVL树中任何节点的两个子树的高度最大差异为一,因此它也被称为高度平衡树。查找、插入和删除在平均和最坏状况下都是O(log n)。增长和删除可能须要经过一次或屡次树旋转来从新平衡这个树。

4、红黑树

  • 红黑树(RBT)是具备如下性质的二叉查找树:
    • 1.节点非红即黑。
    • 2.根节点是黑色。
    • 3.全部NULL结点称为叶子节点,且认为颜色为黑。
    • 4.全部红节点的子节点都为黑色。
    • 5.从任一节点到其叶子节点的全部路径上都包含相同数目的黑节点。

显然红黑树的平衡性能比AVL的略差些,可是通过大量试验证实,实际上红黑树的效率仍是很不错了,仍能达到O(logN)code

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

  • 问题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

参考资料

相关文章
相关标签/搜索