題目:
將一系列給定數字順序插入一個初始爲空的二叉搜索樹(定義爲左子樹鍵值大,右子樹鍵值小),你需要判斷最後的樹是否一棵完全二叉樹,並且給出其層序遍歷的結果。
輸入格式:
輸入第一行給出一個不超過20的正整數N;第二行給出N個互不相同的正整數,其間以空格分隔。
輸出格式:
將輸入的N個正整數順序插入一個初始爲空的二叉搜索樹。在第一行中輸出結果樹的層序遍歷結果,數字間以1個空格分隔,行的首尾不得有多餘空格。第二行輸出“YES”,如果該樹是完全二叉樹;否則輸出“NO”。
輸入樣例1:9 38 45 42 24 58 30 67 12 51輸出樣例1:
38 45 24 58 42 30 12 67 51 YES輸入樣例2:
8 38 24 12 45 58 67 42 51輸出樣例2:
38 45 24 58 42 12 67 51 NO
代碼:
import java.util.Scanner;
public class Main {
//用數組表示二叉樹,k的子節點爲2*k和2*k+1,如果節點值爲0則在此插入i,否則在該節點的子樹中插入i
static int [] arr=new int [10000];
static void insert(int i,int node){
if(arr[node]==0){
arr[node]=i;
return;
}
else if(arr[node]>i){
insert(i, node*2+1);
}
else insert(i, node*2);
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner scanner=new Scanner(System.in);
int n=scanner.nextInt();
for(int i=0;i<n;i++){
int tmp=scanner.nextInt();
insert(tmp, 1);//把輸入插入用數組表示的二叉樹arr中
}
int cnt=0;
boolean flag=true;//用flag標記是否是平衡二叉樹
//如果是二叉樹,則插入的值會分佈在arr[1],arr[2],arr[3],arr[4]...中
for(int i=1;;i++){
if(cnt==n)
break;
if(arr[i]!=0)
{
if(cnt!=0)
System.out.print(" ");
System.out.print(arr[i]);
cnt++;//每遍歷到一個非0節點,則輸出計數器加1
}
else{
flag=false;//如果遍歷到0節點,則說明該節點沒有插入值,則非平衡二叉樹
}
}
System.out.println();
if(flag)
System.out.print("YES");
else System.out.print("NO");
}
}