我正在学习考试,并且从我正在查看的其中一个工作表中,它要求为存储整数的最小堆写一个最大的方法()。
public class Heap {
private int[] arr = new int[100];
private int numElts = 0;
public int largest(){
}
}
最大大小为100个元素,newElt跟踪存储在堆中的当前元素数。
我在想做类似的事情:
int[] newArr = Collections.sort(arr);
return newArr[newElt];
然后那将改变原始堆。 我可以对它进行深层复制,但它说没有必要检查所有堆的元素。
所以有人可以建议一种方法来做到这一点,而不是看每一个元素? 谢谢,
答案 0 :(得分:3)
如果您的结构是堆排序,如果它是-max堆 - 那么您的最大元素将只是arr[0]
。但是因为它是一个最小堆,所有你知道的是max元素是一个叶子节点。
所以你不需要测试每个元素。但是你需要查看最多一半的元素(对于二叉树,叶子的数量在1到一半之间加上一个,包括两个帐户)。
您可以通过知道二进制堆(您描述的)是一个特殊的平衡二进制树来快捷查看叶节点,通过一个小的计算可以告诉您两组叶节点的位置可能是。