问题一解决:
* 第一种状况
首先考虑while循环,result为8,他是左孩子,因此不进入while循环,接着往下,他不是根结点,他不是父结点的右孩子,因此result为父结点5,即返回的插入结点的双亲。
* 第二种状况
result为0,双亲结点的左孩子为-2,因此进入while循环,result为3,接下来进入if语句,他不是根结点,并且父结点的右孩子(1)不为空,因此返回的插入结点的双亲结点是1
* 第三种状况
while循环中,result(2)不是左孩子,因此result为双亲结点1,往下,他是根结点,并且左子树不为空,result为左孩子0.这种状况就至关于满树时插入到新一层的左边位置。html
private HeapNode<T> getNextParentAdd() { HeapNode<T> result = lastNode;// 当前的空白结点 while ((result != root) && (result.getParent().getLeft() != result))//若是当前不是一个满堆,他不是左孩子 result = result.getParent(); if (result != root) { // /不是一个满堆 if (result.getParent().getRight() == null)//右边是空位 result = result.getParent(); else {//右边不空 result = (HeapNode<T>) result.getParent().getRight(); // 不断的向下寻找最后的父结点 while (result.getLeft() != null) result = (HeapNode<T>) result.getLeft(); } } else {// 当前堆是一个满堆 while (result.getLeft() != null) result = (HeapNode<T>) result.getLeft(); } return result; }
问题二解决:举个例子,git
private void heapifyAdd() { T temp; HeapNode<T> next = lastNode; temp = next.getElement(); while ((next != root) && (((Comparable) temp) .compareTo(next.getParent().getElement()) < 0)) { next.setElement(next.getParent().getElement()); next = next.parent; } next.setElement(temp); }
如图在树中插入结点2,那么next指向2,temp=2,这时next不是根结点,而且2(temp)比4(next.getParent().getElement())小,因此如今next的值设置为4(即原来2的那个位置变成4),next指向原来next的父亲结点(即原来的4位置),而后将next的值设为temp即2(原来4的位置变为2),这样就将2和4换位,实现了重排序。算法
问题三解决:首先把待排序的元素在二叉树位置上排列,而后调整为大顶堆或小顶堆,接下来进行排序,以小顶堆为例,根结点为最小,因此拿掉根,而后对堆进行调整,使其符合小顶堆的要求,而后新的堆顶又是最小的,将其拿掉,如此循环...蓝墨云关于这个的测试题,从新梳理一下如图,大顶堆的过程与其相似,但注意在代码实现中,小顶堆排序结果为升序,大顶堆排序结果为降序
api
问题一:在作蓝墨云测试构造大顶堆并排序时,对于过程的输出结果是每次将最大数从堆顶拿下时的结果,并非显示每次排序时的数组状况。
数组
问题一解决:主要错误之处在于测试类,如图中显示,个人过程记录是数据结构
for(int i=0;i<8;i++){ array2.addElement(array.removeMax); array2.removeMax(); System.out.println("第"+i+"次为:"+ array2); }
首先,在循环中array中每次拿掉的最大数添加到array2中,而后输出的是array2中的最大数,那么就至关于每次把array中的最大数输出,array2没有什么做用。应该为学习
for (int i = 0; i <a.length; i++) { array2[i]=array.removeMax(); System.out.println("第"+ i +"次为:"+ array); }这样就把array2的做用发挥出来了,array2中存放array中依次弹出的最大数,在array2中降序排列,而后每次输出array数组,显示如今数组状况,排序的结果就能够用相似上面的for循环依次将array2中的数输出。
问题二解决:测试类经过在循环中使用queue.removeNext()
方法,是因为PriorityQueue类中removeNext方法继承了ArrayHeap类中的removeMin方法,而在ArrayHeap类中,removeMin又使用了方法heapModifyRemove,其中测试
else if (((Comparable)tree[left]).compareTo(tree[right]) < 0) next = left
当left比right小时,返回左,我最开始不理解的是在优先级队列中,当优先级相同时.net
if (arrivalOrder >obj.getArrivalOrder())//优先级相同时,先进先出 result = 1;
应返回左边的arrivalOrder,但在heapModifyRemove中来讲,却返回compareTo右边的,因此我以为矛盾,进行屡次测试后我发现输出的结果没有错。又仔细看代码以后发现,优先级相同时,返回1的状况是arrivalOrder较大,那么就表明它是后进的,并非跟优先级同样大的先,arrivalOrder越大表明晚进,应该后出,因此正好反一下。3d
问题三:实现ArrayHeap类时,发现输出结果老是多一个数
问题三解决:参考了谭鑫同窗的博客,里面提到了解决办法,如图
添加语句以后解决问题,缘由是在将根结点拿掉并用末叶子结点替换后并无将叶结点删除,因此致使出现两次,添加语句tree[count-1] = null;
以后,将其值设置为空,至关于删除。
错题一:
错题一解决:CompareTo方法返回值是int型的,若是前者比后者大的话返回1,小的话返回-1,相等返回0.
这一章感受原理很容易理解,逻辑简单,但用代码实现很差理解,可是书上代码的可用性很高,而后实验方面也花费较长时间,总结出来就是要尽早去掌握核心代码再开展学习。
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | |
---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 |
第一周 | 0/0 | 1/1 | 8/8 |
第二周 | 1163/1163 | 1/2 | 15/23 |
第三周 | 774/1937 | 1/3 | 12/50 |
第四周 | 3596/5569 | 2/5 | 12/62 |
第五周 | 3329/8898 | 2/7 | 12/74 |
第六周 | 4541/13439 | 3/10 | 12/86 |
第七周 | 1740/15179 | 1/11 | 12/97 |
第八周 | 5947/21126 | 1/12 | 12/109 |