---------无论如何,一定要自己做出了,即使花3个小时做出来,也比3次看着别人的答案做出来要好。
好久没刷pat和leetcode了。
对于完全二叉树一定要掌握父节点和子节点的的序号关系。。
然后dfs函数就是遍历路径。。
最后注意判断堆的时候 利用了 A&&B,如果A条件符合,才会判断B,否则B是不判断的。
剪枝,提前return,不然最后一个测试用例会超时。
import java.io.IOException;
import java.util.ArrayList;
import java.util.Scanner;
import java.util.logging.Level;
public class Main {
//如果认为是大顶堆,则 which =1;如果认为是小顶堆,which = -1;
public static boolean isHeap(int []level,int which){
int length = level.length;
for(int i=0;i<length;i++){
int left = 2*i + 1;
int right = 2*i + 2;
if(left < length && (level[left] - level[i])*which>=0 )
return false;
if(right < length && (level[right] - level[i])*which >=0)
return false;
}
return true;
}
public static void dfs(int []level, ArrayList<Integer>path,int current )
if(current >= level.length ) {
if(current % 2 ==1)
return;
if((current-1)/2 > (level.length-1)/2) {
path.forEach(i -> {
String split = i == path.get(path.size()-1)? "" : " ";
System.out.print(level[i] + split);
});
System.out.println();
}
return;
}
for(int i=2;i>0;i--){
path.add(current);
int index = path.size();
dfs(level,path,current*2 + i);
path.remove(index-1);
}
}
public static void main(String[] args) throws IOException {
Scanner scanner = new Scanner(System.in);
int N;
N = scanner.nextInt();
//System.out.println(N);
int array[] = new int[N];
for(int i=0;i<N;i++){
array[i] = scanner.nextInt();
}
dfs(array,new ArrayList<Integer>(),0);
if(array[0] >= array[1]&& isHeap(array,1)){
System.out.println("Max Heap");
return;
}
else if (array[0] <= array[1] && isHeap(array ,-1)){
System.out.println("Min Heap");
return;
}else
System.out.println("Not Heap");
return;
}
}