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

每天用心记录一点点。内容也许不重要,但习惯很重要!

原文地址:https://www.cnblogs.com/binarylei/p/10100273.html