• 二叉树的顺序结构及实现


    目录

    1. 二叉树的顺序结构及实现

    1.1 二叉树的顺序结构

    1.2 堆的概念及结构

    1.3 堆的实现

    1.4 堆排序


    1. 二叉树的顺序结构及实现

    1.1 二叉树的顺序结构

           普通的二叉树是不适合用数组来存储的,因为可能会存在大量的空间浪费。而完全二叉树更适合使用顺序结构存储。现实中我们通常把(一种二叉树)使用顺序结构的数组来存储,需要注意的是这里的堆和操作系统虚拟进程地址空间中的堆是两回事,一个是数据结构,一个是操作系统中管理内存的一块区域分段。

    1.2 堆的概念及结构

            如果将一些元素集合按照完全二叉树的顺序存储方式存储在一个一维数组中,并且满足任意一个节点的值总是不大于或不小于其父节点的值,则将根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最小堆或小根堆。

    总结堆的性质
            ~堆中某个节点的值总是不大于或不小于其父节点的值;
            ~堆总是一棵完全二叉树

    1.3 堆的实现

    堆:

    1. typedef int HPDataType;
    2. typedef struct Heap
    3. {
    4. HPDataType* a;
    5. int size;
    6. int capacity;
    7. }HP;

    堆的初始化:

    1. void HeapInit(HP* php)
    2. {
    3. assert(php);
    4. php->a = NULL;
    5. php->size = php->capacity = 0;
    6. }

    堆的销毁:

    1. void HeapDestroy(HP* php)
    2. {
    3. assert(php);
    4. free(php->a);
    5. php->a = NULL;
    6. php->size = php->capacity = 0;
    7. }

    堆插入数据:

    1. void AdjustUp(HPDataType* a, int child)//向上调整
    2. {
    3. int parent = (child - 1) / 2;
    4. while (child > 0)
    5. {
    6. if (a[child] > a[parent])//大堆
    7. {
    8. Swap(&a[child], &a[parent]);
    9. child = parent;
    10. parent = (child - 1) / 2;
    11. }
    12. else
    13. {
    14. break;
    15. }
    16. }
    17. }
    18. void HeapPush(HP* php, HPDataType x)
    19. {
    20. assert(php);
    21. if (php->size == php->capacity)
    22. {
    23. int newcapacity = php->capacity == 0 ? 4 : php->capacity * 2;
    24. HPDataType* tmp = (HPDataType*)realloc(php->a, sizeof(HPDataType)*newcapacity);
    25. if (tmp == NULL)
    26. {
    27. printf("realloc fail\n");
    28. exit(-1);
    29. }
    30. php->a = tmp;
    31. php->capacity = newcapacity;
    32. }
    33. php->a[php->size] = x;
    34. php->size++;
    35. AdjustUp(php->a, php->size - 1);
    36. }

    堆的删除:

    1. void AdjustDwon(HPDataType* a, int size, int parent)//向下调整
    2. {
    3. int child = parent * 2 + 1;
    4. while (child < size)
    5. {
    6. // 选出左右孩子中小/大的那个
    7. if (child+1 < size && a[child+1] > a[child])
    8. {
    9. ++child;
    10. }
    11. // 孩子跟父亲比较
    12. if (a[child] > a[parent])
    13. {
    14. Swap(&a[child], &a[parent]);
    15. parent = child;
    16. child = parent * 2 + 1;
    17. }
    18. else
    19. {
    20. break;
    21. }
    22. }
    23. }
    24. void HeapPop(HP* php)
    25. {
    26. assert(php);
    27. assert(php->size > 0);
    28. Swap(&(php->a[0]), &(php->a[php->size - 1]));
    29. php->size--;
    30. AdjustDwon(php->a, php->size, 0);
    31. }

    取堆顶元素:

    1. HPDataType HeapTop(HP* php)
    2. {
    3. assert(php);
    4. assert(php->size > 0);
    5. return php->a[0];
    6. }

    判断堆是否为空:

    1. bool HeapEmpty(HP* php)
    2. {
    3. assert(php);
    4. return php->size == 0;
    5. }

    求堆中元素个数:

    1. int HeapSize(HP* php)
    2. {
    3. assert(php);
    4. return php->size;
    5. }

    1.4 堆排序

    1. void HeapSort(int* a, int n)
    2. {
    3. //向上,向下调整时间复杂度均为树高度,即logN
    4. // 建堆方式1:O(N*logN)
    5. //for (int i = 1; i < n; ++i)
    6. //{
    7. // AdjustUp(a, i);
    8. //}
    9. // 建堆方式2:O(N)
    10. for (int i = (n-1-1)/2; i >= 0; --i)
    11. {
    12. AdjustDwon(a, n, i);
    13. }
    14. // O(N*logN)
    15. int end = n - 1;
    16. while (end > 0)
    17. {
    18. Swap(&a[0], &a[end]);
    19. AdjustDwon(a, end, 0);
    20. --end;
    21. }
    22. }
    23. void TestHeapSort()
    24. {
    25. int a[] = { 27, 15, 19, 18, 28, 34, 65, 49, 25, 37 };
    26. HeapSort(a, sizeof(a) / sizeof(int));
    27. }
    28. int main()
    29. {
    30. TestHeapSort();
    31. return 0;
    32. }

  • 相关阅读:
    c语言学习记录 c语言本身有什么
    python+pygame+opencv+gpt实现虚拟数字人直播(一)
    400电话怎么办理(申请开通)
    【1314. 矩阵区域和】
    python小项目:实现C语言在线编译器
    数据挖掘知识点总结
    C++的基类和派生类构造函数
    保姆级vue-pdf的使用过程
    全国计算机等级考试python(未来教育)
    沉睡者IT - 什么是Web3.0?
  • 原文地址:https://blog.csdn.net/blue_jun_/article/details/126815657