当前位置: 首页 > news >正文

堆与二叉树——C语言

一、顺序表底层

#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>typedef int data;
typedef struct Heap
{data* arr;int size;int capacity;
}Heap;void HeapInit(Heap* php);
void HeapDestroy(Heap* php);
//把已有堆进行排序
void treesort(Heap* php);void HeapPush(Heap* php, data x);
void HeapPop(Heap* php);
data HeapTop(Heap* php);
int HeapEmpty(Heap* php);
int HeapSize(Heap* php);void AdjustUp(Heap* a, int child);
void AdjustDown(Heap* a, int n, int parent);void print(Heap* php);
#include"heap.h"void swap(data* x, data* y)
{data z = *x;*x = *y;*y = z;
}//大堆
void AdjustUp(Heap* php, int i)
{int child = i;int parent = (i - 1) / 2;while (child > 0){if (php->arr[child] > php->arr[parent]){swap(&(php->arr[child]), &(php->arr[parent]));child = parent;parent = (child - 1) / 2;}else{break;}}
}//大堆
void AdjustDown(Heap* php, int i, int n)
{int parent = i;int child = 2 * i + 1;while (child < n){//选出大儿子if (((child + 1) < php->size) && (php->arr[child + 1] > php->arr[child])){child++;}if (php->arr[parent] < php->arr[child]){swap(&(php->arr[child]), &(php->arr[parent]));parent = child;child = (parent + 1) * 2;}else{break;}}
}void treesort(Heap* php)
{int n = php->size - 1;while (n){swap(&(php->arr[n]), &(php->arr[0]));AdjustDown(php, 0, n - 1);n--;}
}void HeapInit(Heap* php)
{assert(php);data* tmp = (data*)malloc(sizeof(data) * 4);if (tmp == NULL){perror("malloc failure");return -1;}php->arr = tmp;php->size = 0;php->capacity = 4;
}void HeapDestroy(Heap* php)
{php->size = php->capacity = 0;free(php->arr);php = NULL;
}void HeapPush(Heap* php, data x)
{if (php->capacity == php->size){data* tmp = (data*)realloc(php->arr, sizeof(data) * (php->capacity * 2));if (tmp == NULL){perror("realloc failure");return -1;}php->arr = tmp;php->capacity = php->capacity * 2;}php->arr[php->size] = x;php->size++;AdjustUp(php, php->size - 1);
}void HeapPop(Heap* php)
{assert(php);assert(!HeapEmpty(php));swap(&(php->arr[0]), &(php->arr[php->size - 1]));php->size--;AdjustDown(php, 0, php->size);
}int HeapSize(Heap* php)
{return php->arr+(php->size - 1) - php->arr;
}data HeapTop(Heap* php)
{assert(php);return php->arr[0];
}int HeapEmpty(Heap* php)
{if (php->size == 0){return 1;}else{return 0;}
}void print(Heap* php)
{for (int i = 0; i < php->size; i++){printf("%d ", php->arr[i]);}printf("\n");
}
#include"heap.h"void test1()
{Heap tree;HeapInit(&tree);HeapPush(&tree, 4);HeapPush(&tree, 6);HeapPush(&tree, 2);HeapPush(&tree, 7);HeapPush(&tree, 12);HeapPush(&tree, 9);HeapPush(&tree, 8);HeapPush(&tree, 3);print(&tree);treesort(&tree);print(&tree);HeapDestroy(&tree);
}int main()
{test1();return 0;
}

二、链表底层

#include<stdio.h>
#include<assert.h>
#include<stdlib.h>typedef int data;
typedef struct node
{data a;struct node* left;struct node* right;
}node;node* buynode(data x)
{node* tmp = malloc(sizeof(node));if (tmp == NULL){perror("malloc failure");return -1;}tmp->a = x;tmp->left = NULL;tmp->right = NULL;return tmp;
}node* treecreate()
{node* head = buynode(2);node* node1 = buynode(5);node* node2 = buynode(3);node* node3 = buynode(4);node* node4 = buynode(2);node* node5 = buynode(8);head->left = node1;head->right = node2;node1->left = node3;node1->right = node4;node2->left = node5;return head;
}void preorder(node* head)
{if (head == NULL){printf("NULL ");return 0;}printf("%d ", head->a);preorder(head->left);preorder(head->right);
}void inorder(node* head)
{if (head == NULL){printf("NULL ");return 0;}preorder(head->left);printf("%d ", head->a);preorder(head->right);
}void postorder(node* head)
{if (head == NULL){printf("NULL ");return 0;}preorder(head->left);preorder(head->right);printf("%d ", head->a);
}int size(node* head)
{return head == NULL ? 0 : size(head->left) + size(head->right) + 1;
}int height(node* head)
{int leftheight = 0;int rightheight = 0;if (head == NULL){return 0;}else{leftheight = height(head->left);rightheight = height(head->right);return leftheight > rightheight ? leftheight + 1 : rightheight + 1;}
}int levelnode(node* head, int k)
{if (head == NULL){return 0;}if (k == 1){return 1;}return levelnode(head->left, k - 1) + levelnode(head->right, k - 1);
}int main()
{node* head = treecreate();preorder(head);printf("\n");inorder(head);printf("\n");postorder(head);printf("\n");printf("%d\n", size(head));printf("%d\n", height(head));printf("%d\n", levelnode(head, 3));return 0;
}

相关文章:

  • 鸿蒙开发——3.ArkTS声明式开发:构建第一个ArkTS应用
  • Python爬虫(20)Python爬虫数据存储技巧:二进制格式(Pickle/Parquet)性能优化实战
  • 康养休闲旅游住宿服务实训室:构建产教融合新标杆
  • Flowable7.x学习笔记(二十一)查看我的发起
  • 【ArcGIS Pro微课1000例】0068:Pro原来可以制作演示文稿(PPT)
  • 国产Word处理控件Spire.Doc教程:在Java中为Word文本和段落设置边框
  • 使用 Celery + Redis + Eventlet 实现 Python 异步编程(Windows 环境)
  • Python爬虫实战:获取百度学术专题文献数据并分析,为读者课题研究做参考
  • VRM Add-on for Blender 学习笔记
  • 第7章-3 维护索引和表
  • 【Qt】Qt 构建系统详解:qmake 入门到项目实战
  • LVGL-对象 lv_obj_t
  • 基于Qt的app开发第六天
  • 东方泵业,室外消火栓泵 2#故障灯亮,报警生响
  • 词编码模型和回答问题的LLM是否为同一个; 词编码模型和回答问题模型分开时:需要保证词嵌入维度一致吗
  • STM32--TIM--函数
  • 【iOS】源码阅读(三)——内存对齐原理
  • 4G与5G网络频率:技术演进与应用场景解析
  • 自动化创业机器人:现状、挑战与Y Combinator的启示
  • XMP-Toolkit-SDK 编译与示例程序
  • 印巴开始互袭军事目标,专家:冲突“螺旋式升级”后果或不可控
  • 会计江湖|年报披露关注什么:独董给出的“信号”
  • 讲座预告|全球贸易不确定情况下企业创新生态构建
  • 美乌基金协议:美国搞了一套可在资源富集地区复刻的商业模式
  • 来论|建设性推进缅北和平进程——中国的智慧与担当
  • 印度外交秘书:“朱砂行动”不针对军事设施,无意升级事态