試題1-4: 將"樹類別測試.java"程式中被改成註解的敘述全部恢復,則執行結果如下: ====================================== 樹1的中序追蹤4925137 樹1的前序追蹤1249537 樹1的後序追蹤9452731 樹1的高度:4樹1編號為9的節點階層:4====================================== 修改"樹類別測試.java"中部份敘述,以完成下列指定的功能 試題1.完成前序追蹤 試題2.完成後序追蹤 試題3.完成高度 試題4.完成階層 試題5: 使用recursive方法gcd求兩數的最大公因數,測試36與48之執行結果(12) 試題6: F(0)=0, F(1)=1 F(n)=F(n-1)+F(n-2) 使用recursive方法f求F(n),測試F(8)之結果 試題7: 使用recursive方法求1+2+...+n 試題8: 設計一個最佳時間複雜度可為O(1)而最差時間複雜度可以為O(sqrt(n))的方法 求一個正整數n不等於本身的最大因數。 試題9: 設計一個時間複雜度為O(sqrt(n))的方法 求一個正整數n所有因數的總合。 試題10: 設計一個時間複雜度為O(sqrt(n))的方法 求一個正整數n所有因數的個數。 //檔名:樹類別測試.java //說明:測試「樹類別」各個操作的執行 public class 樹類別測試 { public static void main(String[] 參數) { String[] 字串陣列={"","1","2","3","4","5","","7","","9"}; 樹類別 樹1=new 樹類別(0, 字串陣列); System.out.println("======================================="); System.out.println("樹1的中序追蹤"); 樹1.中序追蹤(1); // System.out.println("\n樹1的前序追蹤"); // 樹1.前序追蹤(1); // System.out.println("\n樹1的後序追蹤"); // 樹1.後序追蹤(1); // System.out.println("\n樹1的高度:"+樹1.高度(1)); // System.out.println("樹1編號為9的節點階層:"+樹1.階層(9)); } //方法:main() 定義區塊結束 } //類別:樹類別測試 定義區塊結束 class 樹類別 { //tree類別 private Object[] 資料陣列; //用於儲存樹類別資料之陣列 private int 最大編號; //代表樹類別節點之最大編號 public 樹類別() { //無參數建構方法 this(1023); //預設之樹類別"最大編號"為1023,也就是有10個階層(level) } public 樹類別(int 最大編號參數) { //一個整數參數之建構方法 最大編號=最大編號參數; //"最大編號"之值由"最大編號參數"決定 資料陣列=new Object[最大編號+1]; //產生一個最大編號為"最大編號"的陣列 } //以下為一個整數參數及一個字串陣列參數之建構方法 //其中字串陣列用以設定樹節點之啟始值 //使用者可以很方便的將整數、浮點數、字元及布林變數等資料 //透過String類別的valueOf方法轉為String類別資料儲存於節點中 public 樹類別(int 最大編號參數, String[] 陣列參數) { int 陣列元素個數=陣列參數.length; if (陣列元素個數>最大編號參數) 最大編號=陣列元素個數; else 最大編號=最大編號參數; 資料陣列=new Object[最大編號+1]; //產生一個最大編號為"最大編號"的陣列 for (int i=0;i<陣列參數.length;i++) if (!陣列參數[i].equals("")) 資料陣列[i]=陣列參數[i]; //若"陣列參數"之元素不為空字串""則設定此節為該元素; //反之,則表示該元素所對應之節點為空,則不設定任何值(即保留原來啟始之null值) } public void 設節點(int v, String 資料) { //用於設定個別節點之資料 if ( v<1 || v > 最大編號) return; //節點編號有誤,無法設定資料 資料陣列[v]=資料; } public boolean 是葉(int v) { if ( 有左子樹(v) || 有右子樹(v) ) return false; else return true; } public boolean 是根(int v) { return (v==1); } // public int 高度 (int v) { //height // } // public int 階層(int v) { //level // } public boolean 有左子樹(int v) { if ( 2*v <= 最大編號 && 資料陣列[2*v]!=null ) return true; else return false; } public boolean 有右子樹(int v) { if ( 2*v+1 <= 最大編號 && 資料陣列[2*v+1]!=null ) return true; else return false; } public void 中序追蹤(int v) { if (有左子樹(v)) 中序追蹤(v*2); 拜訪(v); if (有右子樹(v)) 中序追蹤(v*2+1); } // public void 前序追蹤(int v) { // } // public void 後序追蹤(int v) { // } public void 拜訪(int v) { System.out.print(資料陣列[v]); } } //類別:樹類別 定義區塊結束