package info.frady.real;
import java.util.Arrays;
public class BinaryTreePra {
//练习下binarytree的代码
static int[] tree_max;//区间最大值的模板代码
static int[] arrN;
static int[] tree_min;//最小值
public static void main(String[] args) {
//int[] nodes=new int[]{1,2,3,4,5,6,7,8,9};
arrN=new int[]{1,2,3,4,12,6,7,8,9};
initTree();
System.out.println(Arrays.toString(tree_max));
System.out.println(Arrays.toString(tree_min));
int fromIndex=16;
System.out.println(fromIndex);
System.out.println(query_max(fromIndex+1,fromIndex+1));// 1
System.out.println(query_max(fromIndex+1,fromIndex+2));// 2
System.out.println(query_max(fromIndex+5,fromIndex+9));// 9
System.out.println(query_min(fromIndex+1,fromIndex+1));// 1
System.out.println(query_min(fromIndex+1,fromIndex+2));// 2
System.out.println(query_min(fromIndex+5,fromIndex+9));// 9
}
static int query_max (int start,int end) {
int max = Integer.MIN_VALUE;
int s = start;
int e = end;
while(s<=e){
if(s%2==1) {
max=Integer.max(tree_max[s],max);
}
if(e%2==0) {
max=Integer.max(tree_max[e],max);
}
s=(s+1)>>1;
e=(e-1)>>1;
}
return max;
}
static void update_max(int index,int value) {
while (index>0) {
if(tree_max[index]<value) {
tree_max[index] = value;
}
index=index>>1;
}
}
public static void initTree(){
int l=1;
while (l<arrN.length){
l=l*2;
}
tree_max = new int[2*l];//计算出数组的大小
tree_min = new int[2*l];
Arrays.fill(tree_min,Integer.MAX_VALUE);
int fromIndex = l;//这个是实际数据的开始, fromIndex+1 方的是数组里的第一个数字
for (int i = 0; i < arrN.length; i++) {
int index=fromIndex+i+1;
int v = arrN[i];
update_max(index,v);
update_min(index,v);
}
}
static int query_min (int start,int end) {
int min = Integer.MAX_VALUE;
int s = start;
int e = end;
while(s<=e){
if(s%2==1) {
min=Integer.min(tree_min[s],min);
}
if(e%2==0) {
min=Integer.min(tree_min[e],min);
}
s=(s+1)>>1;
e=(e-1)>>1;
}
return min;
}
static void update_min(int index,int value) {
while (index>0) {
if(tree_min[index]>value) {
tree_min[index] = value;
}
index=index>>1;
}
}
}
SW练习_标准binarytree_求区间最大值
最新推荐文章于 2022-02-24 09:59:45 发布