堆是常使用的优先级队列,可以分为大根堆和小根堆,其中每一次从大根堆(小根堆)取出的元素都是最大(最小)的,下面是java构建大根堆的示例。
大根堆(小根堆)是一棵完全二叉树,其中每个节点的值都大于(小于)或等于子节点的值。关于树、二叉树、完全二叉树以及二叉树的操作(前序遍历)在另一篇文章中说明。下面是大根堆和小根堆的两个示例。
大根堆的描述可以使用数组描述或链表描述,使用数组描述时当树的高度增加,浪费的空间会很大,因此这里使用链表描述大根堆。使用链表描述大根堆需要二叉树节点,下面定义二叉树结点,每个节点至少含有左子树指针和右子树指针和构建堆使用的优先级域,另外可以根据需要添加域值。
package Structure;
//定义树节点
class treeNode{
protected int element;//节点域
protected treeNode leftChild,//左子树指针和右子树指针
rightChild;
//无参构造函数,构建空树
public treeNode(){
leftChild=rightChild=null;
}
//新建节点,插入末尾
public treeNode(int theElement){
element=theElement;
leftChild=rightChild=null;
}
//赋值构造函数,替换节点
public treeNode(int theElement,treeNode theleftchild,
treeNode therightchild){
element=theElement;
leftChild=theleftchild;
rightChild=therightchild;}
};