二叉堆的建立,删除,插入

二叉堆的性质:1.堆中任意节点的值总是不大于(不小于)其子节点的值。2.二叉堆是一颗二叉完全树,一般可以用数组直接表示。如果数组二叉堆下表从0开始, n大于0且为偶数时,该节点是其父节点的右节点。n大于0且为奇数时候,该节点是其父节点的左节点。n的父节点是(n-1)/2。n的两个子节点(如果有的话)2n+1(左),2n+2(右)。

二叉堆的建立

package demo10;
import java.util.ArrayList;


public class test {
	static int[] A = {5 , 2, 4, 1, 3, 0, 6, 7, 8, 9, 10, 11, 12, 13, 14};
	static ArrayList B = new ArrayList();
	public static void main(String[] args) {
		        //建堆
		for (int i = 0; i < A.length; i++)
			B.add(A[i]);
		for (int i = B.size() / 2 - 1; i >= 0; i--)
			maintain(i);
		for (int i = 0; i < B.size(); i++) // 查看是否建堆成功
		    System.out.println(B.get(i));
	}
	
	 static void maintain(int indx){
	        //堆维护
		 while (indx < B.size() / 2){
	            //只需对根节点维护
	        int temp = optimal(indx * 2 + 1, indx, indx * 2 + 2);
	        if (temp == indx)
	            break;
	        else swap(indx, temp);
	            indx = temp; //对被交换的子节点再进行维护
	     }
	 }
	        
	private static void swap(int i, int j) {
		int temp = B.get(i);
		int temp1 = B.get(j);
		B.set(i, temp1);
		B.set(j, temp);	
	}
			
	static int optimal(int l,int i,int r){
			        //依据性质找出最为优先的
		if (r > B.size() - 1 && B.get(l) > B.get(i))
			i = l;
		if (r <= B.size() - 1) {
			if (B.get(l) > B.get(i))
				i = l;
			if (B.get(r) > B.get(i))
			    i = r;
		}
		return i;
	}
}

二叉堆的删除

private static void Delete() {
		// TODO Auto-generated method stub
		B.set(0, B.get(B.size() - 1)); 
		B.remove(B.size() - 1); // 把第一个位置的数字改成最后一个位置的数字 然后删除最后一个位置
		maintain(0);
	}

二叉堆的插入

 private static void Insert(int i) {
		// TODO Auto-generated method stub
		B.add(i);
		for (int j = B.size() / 2 - 1; j >= 0; j--) // 添加一条数据然后重新建堆就行
			maintain(j);
	}

你可能感兴趣的:(数据结构与算法)