所以,我试图在这里实现bottomupheap算法:http: //www.apl.jhu.edu/Classes/Notes/Felikson/courses/605202/lectures/L8/L8.html
算法bottomUpHeap(S) 输入:存储 2h-1 个键的序列 S 输出:一个堆 H 将密钥存储在 S 中 如果 S 为空,则 返回一个空堆 从 S 中删除第一个密钥 k 将 S 拆分为子序列 S1 和 S2,每个子序列的大小为 (n-1)/2 H1¬bottomUpHeap(S1) H2¬bottomUpHeap(S2) 创建二叉树H,其中k在根,H1在左子树,H2在右子树 如有必要,从根执行向下堆冒泡 返回 H
自从我用 java 编程以来已经有一段时间了,而且我不断收到一些我不知道的错误。我想知道是否有人会通过清理一些算法步骤来帮助我。
我创建了一个带有数据和左右引用指针(或 java 调用它们的任何东西)的堆节点。输入序列是一个数组,它被转换为ArrayList
. 这就是我传递给上面函数的内容。
我从 S 中删除第一个密钥并使用该密钥创建一个新节点。在我的示例中,我只使用Integer
s 并将键设置为数据引用。
然后我使用
S1 = S.sublist(0, S.length/2)
和
S2 = S.sublist(S.length/2, S.length)
继承人我到目前为止:
AnArrayList
作为 S 传递。Tree
定义为Tree(data, left, right)
。谢谢。
private Tree Heapify(List<Integer> S){
if (S.isEmpty()){
Tree emptyHeap = new Tree();
return emptyHeap;
}
int tmpk = S.get(0);
S.remove(0);
int halfArr = S.size()/2;
List<Integer> S1 = S.subList(0, halfArr);
List<Integer> S2 = S.subList(halfArr, S.size());
Tree k = new Tree(tmpk, Heapify(S1), Heapify(S2));
//Downheap.
return null;
}
看起来,当传递一个空列表时,由于某种原因使用子列表时它不会认为它是一个空列表。看起来当它尝试对诸如 S.isEmpty() 之类的空对象执行任何操作时会引发错误。
谢谢!