Java优先队列左式堆建立及基本操作。

节点类的定义

package leftHeap;

import java.util.Queue;
import java.util.concurrent.LinkedBlockingDeque;


public class BinTreeNode  {

private int data;
private BinTreeNode  pre;
private BinTreeNode  right;
private BinTreeNode  left;

public BinTreeNode(int data,BinTreeNode  pre,BinTreeNode  left, BinTreeNode  right){
this.data = data;
this.pre  = pre;
this.left = left;
this.right = right;


}

public int getSize(){
if(this==null){
return 0;
}
else{
return 1+this.left .getSize()+this.right.getSize();
}
}
public  int getHeight() {
return 1+Math.max(this.left!=null?this.left.getHeight():-1, this.right!=null?this.right.getHeight():-1);
}
public int getNPL(){
return 1+Math.min(this.left !=null?this.left.getNPL():0, this.right!=null?this.right.getNPL():0);
}
public int getData() {
return data;
}
public void setData(int data) {
this.data = data;
}
public BinTreeNode  getLeft() {
return left;
}
public void setLeft(BinTreeNode  left) {
this.left = left;
}
public BinTreeNode  getRight() {
return right;
}
public void setRight(BinTreeNode  right) {
this.right = right;
}
//节点所在位置是否平衡
public static boolean isnodebalance(BinTreeNode v){
BinTreeNode  p = v;
Queue<BinTreeNode> q = new LinkedBlockingDeque<BinTreeNode>(); 
q.add(p);
while(!q.isEmpty()){
p = q.poll();
      if( Math.abs((p.getRight()!=null?p.getRight().getHeight():-1) - (p.getLeft()!=null?p.getLeft().getHeight():-1))>1) return false;
if(p.getLeft()!=null) q.add(p.getLeft());
if(p.getRight()!=null) q.add(p.getRight());
}
return true;
}
public BinTreeNode getPre() {
return pre;
}
public void setPre(BinTreeNode pre) {
this.pre = pre;
}

}



/*
 *优先队列 左式堆实现,insert deletemax 均可在O(log n)时间内完成。findMax为O(1);
 *meage合并函数,只对NPL更小的二叉树右侧操作,时间复杂度在O(log n),借于此实现堆合并,插入,删除操作
 *均为log N;  左式堆定义了只对NPL小的右侧就行操作,结构上不在满足满二叉树的连续和紧凑性故只能使用树形结构实现。
 */




package leftHeap;


public class leftHeap {
private BinTreeNode root = null;
public leftHeap(int x){
this.root = new BinTreeNode(x, null, null, null);
}
public BinTreeNode getRoot() {
return root;
}
public void setRoot(BinTreeNode root) {
this.root = root;
}
//插入操作
public void insert(int x){
BinTreeNode p = new BinTreeNode(x, null, null, null);
root = merge(root,p);
}
//删除对大值。即根节点
public int deletemax(){
int t = root.getData();
BinTreeNode a =root.getLeft();
BinTreeNode b = root.getRight();
root = merge(a,b);
return t;
}
//
public int findmax(){
return root.getData();
}
//左式堆中最本质的操作,合并A,B树的操作。
private BinTreeNode merge(BinTreeNode a, BinTreeNode b) {
if(a==null) return b;
if(b==null) return a;
if(a.getData()<b.getData()){
BinTreeNode q = a;
a = b;
b = q;
}
a.setRight( merge(a.getRight(),b));
a.getRight().setPre(a);
if((a.getLeft()!=null?a.getLeft().getNPL():0)
<(a.getRight()!=null?a.getRight().getNPL():0)){
BinTreeNode q = a.getLeft();
a.setLeft(a.getRight());
a.setRight(q);
}

return a;
}
public static void main(String[] args){
leftHeap lh = new leftHeap(0);
   lh.insert(1);
   lh.insert(3);
   lh.insert(2);
   lh.insert(6);
   lh.insert(5);
   lh.insert(4);
   System.out.println("..............."+lh.findmax()+"...............");
   System.out.println("..............."+lh.deletemax()+"...............");
   System.out.println("..............."+lh.deletemax()+"...............");
   System.out.println("..............."+lh.deletemax()+"...............");
   System.out.println("..............."+lh.deletemax()+"...............");
   
   


}




}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值