L3-010. 是否完全二叉搜索樹--java實現

題目:

將一系列給定數字順序插入一個初始爲空的二叉搜索樹(定義爲左子樹鍵值大,右子樹鍵值小),你需要判斷最後的樹是否一棵完全二叉樹,並且給出其層序遍歷的結果。

輸入格式:

輸入第一行給出一個不超過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");
	}
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章