1.树是非线性结构,其元素组织为一个层次结构
html
9.使用决策树能够设计专家系统java
在二叉查找树中:git
若任意节点的左子树不空,则左子树上全部结点的值均小于它的根结点的值; 任意节点的右子树不空,则右子树上全部结点的值均大于它的根结点的值; 叶节点的左、右子树也分别为二叉查找树。 没有键值相等的节点。
与次优二叉树相对,二叉排序树是一种动态树表。其特色是:树的结构一般不是一次生成的,而是在查找过程当中,当树中不存在关键字等于给定值的结点时再进行插入。新插入的结点必定是一个新添加的叶子结点,而且是查找不成功时查找路径上访问的最后一个结点的左孩子或右孩子结点。算法
1.首先执行查找算法,找出被插结点的父亲结点。数组
判断被插结点是其父亲结点的左、右儿子。将被插结点做为叶子结点插入。服务器
若二叉树为空。则首先单独生成根结点。首先执行查找算法,找出被插结点的父亲结点。数据结构
判断被插结点是其父亲结点的左、右儿子。将被插结点做为叶子结点插入。学习
若二叉树为空。则首先单独生成根结点。测试
2.执行删除结点算法设计
在二叉排序树删去一个结点,分三种状况讨论:
1.若结点为叶子结点,即左子树和右子树均为空树。因为删去叶子结点不破坏整棵树的结构,则能够直接删除此子结点。
2.若结点只有左子树或右子树,此时只要令或直接成为其双亲结点的左子树或右子树便可,做此修改也不破坏二叉排序树的特性。
3.若结点的左子树和右子树均不空。在删去结点以后,为保持其它元素之间的相对位置不变,可按中序遍历保持有序进行调整,能够令结点的直接前驱(或直接后继)替代该结点,而后再从二叉排序树中删去它的直接前驱(或直接后继)即让结点的左子树(若是有的话)成为结点左子树的最左下结点(若是有的话),再让左子树成为结点的左右结点的父结点。
4.右旋转
若是由根的左子结点的左子树上的长路径而带来的不平衡性。将执行步骤: 令根的左子结点变为新的根。 令原根结点变为新的根结点的右子结点。 令原根的左子结点的右子结点变为原根的结点的新的左子结点。
5.左旋转
若是由根的右子结点的右子树上的长路径而带来的不平衡性。将执行步骤: 令根的右子结点变为新的根。 令原根结点变为新的根结点的左子结点。 令原根的右子结点的左子结点变为原根的结点的新的右子结点。
6.右-左旋转
7.左-右旋转
若是不平衡性是由根的左子结点的右子树中的长路径引起的,则必须先绕那个异常子树执行一次左旋转,而后再绕跟执行一次右旋转。
问题1解决方案:
一、先序遍历——先访问根,再自左向右遍历子树
二、中序遍历——遍历左子树,而后访问根,而后自左向右遍历余下的各个子树
三、后续遍历——自左向右遍历各个子树,而后访问根
四、层序遍历——从树的顶层(根)打包底层,从左至右,访问树中每层的每一个结点
问题2解决方案:
满二叉树——除了叶结点外每个结点都有左右子叶且叶子结点都处在最底层的二叉树。
彻底二叉树——若设二叉树的高度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第h层有叶子结点,而且叶子结点都是从左到右依次排布,这就是彻底二叉树。
满二叉树必定是彻底二叉树,彻底二叉树不必定是满二叉树。
问题3解决方案:首先咱们须要了解二叉树中元素是如何放置的。咱们定义一个根的元素,而后把新加进来的元素和根比较(以第二个加进来的元素为10,根为20举例)。10<20,因此咱们将10放在根的左结点,因为根的左子树目前只有一个元素因此咱们将10设置为根的左子树的根。若是第三个元素是11,那么咱们首先和根比较,小于20,那么咱们将11往下放,与10比较,比10大,那么咱们放在10的右结点上。(若是添加的元素比20小也比10小那么放在10的左结点)以此类推。右子树也是同样的道理。总的来讲,二叉树的元素放置是以根为基准,比根大的放右子树,比根小的放左子树。若是同样的话左右子树任君挑选。
问题4解决方案:若是二叉查找树是平衡的,每次比较时都会排除差很少一半的元素。树越不平衡,它离线性结构越近,效率也就越低。
1.
解析:对队列的操做没有记清,这道题全部的操做都是队列的操做。
2.
解析:若是在空堆栈上调用pop方法,则抛出EmptyCollectionException。
3.
单词:self-referential(自引用对象)
4.
5.
单词:insertion (插入)
本周主要学习了树和二叉查找树。学到了许多重要的知识,例如四种遍历、三种表达式、关于树的问题的一些计算、二叉查找树的平衡因子等等,收获颇多。
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 10000行 | 30篇 | 400小时 | |
第一周 | 56/56 | 2/2 | 20/20 | 主要学会了简单的操做Linux以及如何编写简单的java程序并将它上传到码云 |
第2、三周 | 331/407 | 3/5 | 23/43 | 学会了一些类和程序包的使用,也明白了C语言和Java在有些地方的区别 |
第四周 | 595/1002 | 2/7 | 20/60 | 学会了IDEA以及用IDEAgit码云,也学会了TDD测试 |
第五周 | 1621/2623 | 2/9 | 17/77 | 见识了服务器与用户连接的代码,也学习了继承的一些知识。 |
第六周 | 1770/4393 | 1/10 | 22/99 | 学习了多态以及与接口和继承的关系,还有就是对异常的学习和处理异常的方法以及自定义一个异常 |
第七周 | 1747/6140 | 3/13 | 23/122 | 学习了渐进复杂度的计算,栈和队列的学习,分别用数组和链表实现队列 |
第八周 | 384/6524 | 1/14 | 20/142 | 学习了一些查找和排序的算法,也学会了计算ASL |
第九周 | 1895/8419 | 3/17 | 22/164 | 学习了树的四种遍历,和怎样根据已知序列求未知序列等等 |
计划学习时间:20小时
实际学习时间:22小时
改进状况:无