Java資料結構和演算法(三)順序儲存的樹結構
阿新 • • 發佈:2018-12-11
Java資料結構和演算法(三)順序儲存的樹結構
二叉樹也可以用陣列儲存,可以和完全二叉樹的節點一一對應。
一、樹的遍歷
// 二叉樹儲存在陣列中 int[] data; public void preOrder() { preOrder(0); } // 前序遍歷指定的節點 public void preOrder(int index) { System.out.printf(data[index] + " "); int leftIndex = 2 * index + 1; int rightIndex = 2 * index + 2; // 左子樹 if (leftIndex < data.length) { preOrder(leftIndex); } // 右子樹 if (rightIndex < data.length) { preOrder(rightIndex); } }
二、堆排序
椎排序是選擇排序中的一種,也是找出最大的一個數再進行交換位置。椎僅為大椎和小椎,所謂大椎就是樹的所有父節點的值都比子節點大的樹。
public void heapSort(int[] arr) { // 找到最大的非葉子節點 int start = (arr.length - 1) / 2; for (int i = start; i >= 0; i--) { maxHeap(arr, arr.length, i); } for (int i = arr.length - 1; i > 0; i--) { int tmp = arr[i]; arr[i] = arr[0]; arr[0] = tmp; maxHeap(arr, i, 0); } } // 轉換指定索引位為大頂堆,大頂椎的第一個節點一定是陣列中的最大值 public void maxHeap(int[] arr, int size, int index) { int leftIndex = 2 * index + 1; int rightIndex = 2 * index + 2; int maxIndex = index; if (leftIndex < size && arr[leftIndex] > arr[maxIndex]) { maxIndex = leftIndex; } if (rightIndex < size && arr[rightIndex] > arr[maxIndex]) { maxIndex = rightIndex; } if (maxIndex != index) { int tmp = arr[index]; arr[index] = arr[maxIndex]; arr[maxIndex] = tmp; maxHeap(arr, size, maxIndex); } }
每天用心記錄一點點。內容也許不重要,但習慣很重要!