1.二叉查找树是一种带有附加属性的二叉树,即对树的每一个结点都有左结点小于父结点,右结点小于或等于父结点。html
2.二叉查找树的定义是二叉树定义的扩展。前端
方法 | 描述 |
---|---|
addElement | 往树中添加一个元素 |
removeElement | 从树中删除一个元素 |
removeAllOccurrences | 从树中删除所指定元素的任何存在 |
removeMin | 删除树中最小的元素 |
removeMax | 删除树中最大的元素 |
findMin | 返回一个指向树中最小元素的引用 |
findMax | 返回一个指向树中最小元素的引用 |
1.每一个BinaryTreeNode对象要维护一个指向结点所储存元素的引用,另外还要维护指向结点的每一个孩子的引用。node
1.用BinarySearchTreeList类实现ListADT接口和OrderedListADT接口。git
操做 | 说明 |
---|---|
add | 向列表添加一个元素 |
removeFirst | 删除列表的首元素 |
removeLast | 删除列表的末元素 |
remove | 删除列表中一个特定元素 |
first | 考察列表前端那个元素 |
last | 考察列表末端那个元素 |
contains | 断定列表是否含有一个特定元素 |
is Empty | 断定列表是否为空 |
size | 断定列表中的元素数目 |
3.树的主要使用之一就是为其余集合提供高效的实现。算法
4.BinarySearchTreeList实现的分析:数组
操做 | 说明 | LinkedList | BinarySearchTreeList |
---|---|---|---|
add | 向列表添加一个元素 | O(n) | O(log n)* |
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操做和remove操做均可能致使树变得不平衡。数据结构
1.若是二叉查找树不平衡,其效率可能比线性结构还要低。ide
2.维护树的平衡有着多种算法,有些蛮力方法(中序遍历,把数组的中间元素做为树根,再构造出左平衡子树和右平衡子树。),有些方案更优美(AVL树和红黑树)。函数
3.右旋: 在最小平衡子树根节点平衡因子>=2且在根节点的左孩子的左孩子插入元素,进行右旋性能
使树根的左孩子元素成为新的根元素。
使原根元素成为这个新树根的右孩子元素。
使原树根的左孩子的右孩子,成为原树根的新的左孩子。
4.左旋: 在最小平衡子树根节点平衡因子>=-2且在根节点的右孩子的右孩子插入元素,进行左旋。
使树根的右孩子元素成为新的根元素。
使原根元素成为这个新树根的左孩子元素。
使原树根的右孩子的左孩子,成为原树根的新的右孩子。
5.右左旋:最小平衡子树根节点(80)的右孩子(100)的左孩子(90)的子节点(95)插入新元素,先绕根节点的右孩子节点(100)右旋,再围根节点(80)左旋
6.左右旋:在最小平衡子树根节点(80)的左孩子(50)的右孩子(70)的子节点插入新元素,先绕根节点的左孩子节点(50)右旋,再围根节点(80)左旋
1.右子树的高度减去左子树的高度称为该结点的平衡因子。
2.树(或树的任何子树)只有两种途径能变得不平衡:插入结点或删除结点。
3.由于须要上溯树,因此AVL树一般最好实现为每一个结点都包含一个指向其父结点的引用。
4.AVL树的插入操做首先会按照普通搜索二叉树的插入操做进行,当插入一个数据后,咱们会沿着插入数据时所通过的的节点回溯,回溯的过程当中会判回溯路径中的每一个节点的左子支高度与右子支高度之差的绝对值是否超过1,若是超过1咱们就进行调整,调整的目的是使得该节点知足AVL树平衡的定义。
问题1:本身看了一下红黑树,不是很理解,上网查了一下
问题1解决方案:红黑树和以前所讲的AVL树相似,都是在进行插入和删除操做时经过特定操做保持二叉查找树的平衡,从而得到较高的查找性能。自从红黑树出来后,AVL树就被放到了博物馆里,听说是红黑树有更好的效率,更高的统计性能。不过在我了解了红黑树的实现原理后,并不相信这是真的,关于这一点咱们会在后面进行讨论。
红黑树和AVL树的区别在于它使用颜色来标识结点的高度,它所追求的是局部平衡而不是AVL树中的很是严格的平衡。以前咱们在讲解AVL树时,已经领教过AVL树的复杂,但AVL树的复杂比起红黑树来讲简直是小巫见大巫。红黑树是真正的变态级数据结构。
问题1:在无返回值的条件下语句有return的做用?
问题1解决方法:return的使用一直在存在返回值条件下使用,可是从未在无返回值条件下使用。若是return后面不接内容的话,就会结束该方法并不会输出任何内容的。
(1.)return语句:是指结束该方法,继续执行方法后的语句。
(2.)break语句:是指在循环中直接退出循环语句(for,while,do-while,foreach),break以后的循环体里面的语句也执行。
(3.)continue语句:是指在循环中中断该次循环语句(for,while,do-while,foreach),本次循环体中的continue以后语句不执行,直接跳到下次循环。
问题2:在方法中,我将要进行操做的结点做为形参放入方法中(以 node T为例),而后对T.left进行操做,可是我返回到主程序后,发现主函数的树并无发生变化。
问题2解决办法:
第一步:经过调试我发如今方法里,树的确变化了,证实错误不在个人代码思路上。
第二步:通过个人实验发现,若直接对结点T进行操做,主程序里的树是能够变化的。所以,我意识到只有对形参自己进行操做,才会将操做保存到主程序中,若用形参去调用其余方法,这个变化不会保存。
1.Which of the following methods removes an element from a queue?
A . enqueue
B . dequeue
C . first
D . pop
E . push
解析:dequeue方法从队列中删除元素
2.In an ideal implementations of a stack and a queue, all operations are ______________________ .
A . O(1)
B . O(n)
C . O(n log n)
D . O(n2)
E . it depends on the operation
解析:
在堆栈和队列的良好实现中,全部操做都须要固定的时间。
3.It is possible to implement a stack and a queue in such a way that all operations take a constant amount of time.
A . true
B . false
解析:堆栈和队列的理想实现要求全部操做都须要恒定的时间量。
点评过的同窗博客和代码
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 109/109 | 2/2 | 20/20 | |
第2、三周 | 729/838 | 2/4 | 47/67 | |
第四周 | 750/1588 | 2/6 | 22/89 | |
第五周 | 1588/2698 | 2/7 | 34/133 | |
第六周 | 1350/4035 | 2/9 | 24/157 | |
第九周 | 3364/7399 | 5/14 | 97/254 | |
第十周 | 618 /8071 | 1/15 | 22/276 | |
第十一周 | 772/8843 | 3/18 | 16/292 |