JAVA排序演算法實現代碼-二叉樹排序
- /**
- * JAVA排序演算法實現代碼-二叉樹排序。
- *
- * @author 老紫竹 JAVA世紀網(java2000.net)
- *
- */
- public class Test {
- public static int[] a = { 0, 10, 32, 1, 9, 5, 7, 12, 2, 4, 3 }; // 預設資料數組
- public static int[] Data = new int[20]; // 預設資料數組
-
- public static void main(String args[]) {
- int i; // 迴圈計數變數
- int Index = 1; // 資料索引變數
- BNTreeArray BNTree = new BNTreeArray(); // 聲明二叉樹數組
-
- Data[Index] = a[Index];
- BNTreeArray.TreeData[0] = Data[Index];
- Index++;
- for (i = 2; i < a.length; i++) {
- Data[Index] = a[Index];
- BNTree.Create(Data[Index]); // 建立二叉尋找樹
- Index++;
- }
-
- // 排序前資料內容
- System.out.print("排序前 : ");
- for (i = 1; i < Index; i++)
- System.out.print(" " + Data[i] + " ");
- System.out.println("");
-
- // 排序後結果
- System.out.print("排序後 : ");
- BNTreeArray.InOrder(0); // 中序遍曆
- }
- }
-
- class BNTreeArray {
- public static int MaxSize = 20;
- public static int[] TreeData = new int[MaxSize];
- public static int[] RightNode = new int[MaxSize];
- public static int[] LeftNode = new int[MaxSize];
-
- public BNTreeArray() {
- int i; // 迴圈計數變數
-
- for (i = 0; i < MaxSize; i++) {
- TreeData[i] = 0;
- RightNode[i] = -1;
- LeftNode[i] = -1;
- }
- }
-
- // ----------------------------------------------------
- // 建立二叉樹
- // ----------------------------------------------------
- public void Create(int Data) {
- int i; // 迴圈計數變數
- int Level = 0; // 樹的階層數
- int Position = 0;
-
- for (i = 0; TreeData[i] != 0; i++)
- ;
-
- TreeData[i] = Data;
- while (true) // 尋找節點位置
- {
- // 判斷是左子樹或是右子樹
- if (Data > TreeData[Level]) {
- // 右樹是否有下一階層
- if (RightNode[Level] != -1)
- Level = RightNode[Level];
- else {
- Position = -1; // 設定為右樹
- break;
- }
- } else {
- // 左樹是否有下一階層
- if (LeftNode[Level] != -1)
- Level = LeftNode[Level];
- else {
- Position = 1; // 設定為左樹
- break;
- }
- }
- }
-
- if (Position == 1) // 建立節點的左右連結
- LeftNode[Level] = i; // 連結左子樹
- else
- RightNode[Level] = i; // 連結右子樹
- }
-
- // ---------------------------------------------------------
- // 二叉樹中序遍曆
- // ---------------------------------------------------------
- public static void InOrder(int Pointer) {
- if (Pointer != -1) // 遍曆的終止條件
- {
- InOrder(LeftNode[Pointer]); // 處理左子樹
- // 處理列印節點內容
- System.out.print(" " + TreeData[Pointer] + " ");
- InOrder(RightNode[Pointer]); // 處理右子樹
- }
- }
- }
/** * JAVA排序演算法實現代碼-二叉樹排序。 * * @author 老紫竹 JAVA世紀網(java2000.net) * */public class Test { public static int[] a = { 0, 10, 32, 1, 9, 5, 7, 12, 2, 4, 3 }; // 預設資料數組 public static int[] Data = new int[20]; // 預設資料數組 public static void main(String args[]) { int i; // 迴圈計數變數 int Index = 1; // 資料索引變數 BNTreeArray BNTree = new BNTreeArray(); // 聲明二叉樹數組 Data[Index] = a[Index]; BNTreeArray.TreeData[0] = Data[Index]; Index++; for (i = 2; i < a.length; i++) { Data[Index] = a[Index]; BNTree.Create(Data[Index]); // 建立二叉尋找樹 Index++; } // 排序前資料內容 System.out.print("排序前 : "); for (i = 1; i < Index; i++) System.out.print(" " + Data[i] + " "); System.out.println(""); // 排序後結果 System.out.print("排序後 : "); BNTreeArray.InOrder(0); // 中序遍曆 }}class BNTreeArray { public static int MaxSize = 20; public static int[] TreeData = new int[MaxSize]; public static int[] RightNode = new int[MaxSize]; public static int[] LeftNode = new int[MaxSize]; public BNTreeArray() { int i; // 迴圈計數變數 for (i = 0; i < MaxSize; i++) { TreeData[i] = 0; RightNode[i] = -1; LeftNode[i] = -1; } } // ---------------------------------------------------- // 建立二叉樹 // ---------------------------------------------------- public void Create(int Data) { int i; // 迴圈計數變數 int Level = 0; // 樹的階層數 int Position = 0; for (i = 0; TreeData[i] != 0; i++) ; TreeData[i] = Data; while (true) // 尋找節點位置 { // 判斷是左子樹或是右子樹 if (Data > TreeData[Level]) { // 右樹是否有下一階層 if (RightNode[Level] != -1) Level = RightNode[Level]; else { Position = -1; // 設定為右樹 break; } } else { // 左樹是否有下一階層 if (LeftNode[Level] != -1) Level = LeftNode[Level]; else { Position = 1; // 設定為左樹 break; } } } if (Position == 1) // 建立節點的左右連結 LeftNode[Level] = i; // 連結左子樹 else RightNode[Level] = i; // 連結右子樹 } // --------------------------------------------------------- // 二叉樹中序遍曆 // --------------------------------------------------------- public static void InOrder(int Pointer) { if (Pointer != -1) // 遍曆的終止條件 { InOrder(LeftNode[Pointer]); // 處理左子樹 // 處理列印節點內容 System.out.print(" " + TreeData[Pointer] + " "); InOrder(RightNode[Pointer]); // 處理右子樹 } }}
運行結果
排序前 : 10 32 1 9 5 7 12 2 4 3
排序後 : 1 2 3 4 5 7 9 10 12 32