1. 程式人生 > >Java資料結構和演算法(三)順序儲存的樹結構

Java資料結構和演算法(三)順序儲存的樹結構

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);
    }
}

每天用心記錄一點點。內容也許不重要,但習慣很重要!