数据结构:Heap(二叉树)的基本操作

目录

1.有关二叉树必须知道的几个基本概念

2.有关二叉树的基本操作

2.0有关元素的定义以及要进行的操作

2.1初始化和销毁操作

2.2插入操作以及上调操作

2.2.1插入操作以及上调操作的图解

2.2.2插入操作以及上调操作的代码

2.3删除根元素及其下调操作

2.3.2删除根元素及其下调操作的代码


1.有关二叉树必须知道的几个基本概念

完全二叉树:前n-1层满,最后一层未必满,但自左向右是连续的

满二叉树:相较于完全二叉树,最后一层叶子是完全的

经实验可知,数组是实现叉树这种数据结构的最好方式

由图可知

算孩子公式 leftchild= 2parent +1   rightchild=2parent+2

算父亲公式 parent=(child-1)/2

2.有关二叉树的基本操作

2.0有关元素的定义以及要进行的操作

typedef int HPDataType;
typedef struct Heap
{HPDataType* a;int size;int capacity;
}HP;

void HPInit(HP* php);
void HPDestroy(HP*php);void HPPush(HP* php, HPDataType x);//插入操作
void Swap(HPDataType* px, HPDataType* py);
void AdjustUp(HPDataType* a, int child);//上调操作void HPPop(HP* php);//删除根操作
void AdjustDown(HPDataType* a, int n, int parent);//下调操作bool HPEmpty(HP* php);

2.1初始化和销毁操作

void HPInit(HP* php)
{assert(php);php->a = NULL;php->size = 0;php->capacity = 0;
}void HPDestroy(HP* php)
{assert(php);free(php);php->a = NULL;php->capacity = 0;php->size = 0;
}

2.2插入操作以及上调操作

2.2.1插入操作以及上调操作的图解

2.2.2插入操作以及上调操作的代码

void HPPush(HP* php, HPDataType x)//入
{assert(php);if (php->size = php->capacity){size_t newcapacity = php->capacity == 0 ? 4 : 2 * php->capacity;HPDataType* tmp = (HPDataType*)realloc(php->a, newcapacity * sizeof(HPDataType));if (tmp == NULL){perror("realloc fail");}php->a = tmp;php->capacity = newcapacity;}php->a[php->size] = x;php->size++;//开辟空间并且插入到最后一个树叶AdjustUp(php->a, php->size-1);//将此被插入元素向上调整至合适位置
}void AdjustUp(HPDataType* a, int child)//将size-1传递给child,让child的初始指向被插入的新元素
{int parent = (child - 1) / 2;while (child>0)//一旦这个被插入元素到了根部(child=0),停止!{if (a[child] < a[parent]){Swap(&a[child], &a[parent]);child = parent;//将child移动到parent的位置parent = (parent - 1) / 2;}else{break;}}
}void Swap(HPDataType* px, HPDataType* py)
{HPDataType temp;temp = *px;*px = *py;*py = temp;
}

2.3删除根元素及其下调操作

2.3.1删除根元素及其下调操作的图解

2.3.2删除根元素及其下调操作的代码

void HPPop(HP* php)//删除根元素
{assert(php);assert(php->size > 0);Swap(&php->a[0], &php->a[php->size - 1]);php->size--;AdjustDown(php->a, php->size, 0);
}//向下调整,就是将新的根元素下移至它的合适的位置
void AdjustDown(HPDataType* a, int n, int parent)
{int child = (2 * parent) + 1;while (child<n)//n=size{if (a[child] > a[child + 1])//找小孩子,和小孩子交换,{//让最小的孩子成为新根才能保持小堆形态child++;//如果左孩子不是小,那么右才是小}if(a[child]<a[parent])//如果小孩子比父小,那么不符合小堆,需要交换{Swap(&a[parent], &a[child]);parent = child;//更新父下标指向child = (2 * parent) + 1;//更新孩子下标指向}else{break;}}
}

3.研究笔记

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/524984.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

css网格布局简单介绍

前端网格布局是一种用于在网页上创建复杂网格系统的布局技术。它允许开发者通过简单的语法来定义和控制元素的排列方式&#xff0c;使得页面布局更加灵活和可预测。在CSS中&#xff0c;网格布局可以通过display: grid属性来实现。 特点 1. **灵活性**&#xff1a;网格布…

基于JAVA+ springboot实现的抗疫物质信息管理系统

基于JAVA springboot实现的抗疫物质信息管理系统设计和实现 博主介绍&#xff1a;多年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 央顺技术团队 Java毕设项目精品实战案例《1000套》 欢迎点赞 收藏 ⭐留言 …

SpringBoot源码

SpringBoot核心前置内容 1.Spring注解编程的发展过程 1.1 Spring 1.x 2004年3月24日&#xff0c;Spring1.0 正式发布&#xff0c;提供了IoC&#xff0c;AOP及XML配置的方式。 在Spring1.x版本中提供的是纯XML配置的方式&#xff0c;也就是在该版本中必须要提供xml的配置文件…

2024年k8s最新版本安装教程

k8s安装教程 1 k8s介绍2 环境搭建2.1 主机准备2.2 主机初始化2.2.1 安装wget2.2.2 更换yum源2.2.3 常用软件安装2.2.4 关闭防火墙2.2.5 关闭selinux2.2.6 关闭 swap2.2.7 同步时间2.2.8 修改Linux内核参数2.2.9 配置ipvs功能 2.3 容器安装2.3.1 设置软件yum源2.3.2 安装docker软…

Cloudflare Tunnel:无惧DDOS_随时随地安全访问局域网Web应用

利用此方法&#xff0c;您可以在局域网&#xff08;尤其是NAS&#xff09;上搭建的Web应用支持公网访问&#xff0c;成本低而且操作简单&#xff01; 如果这是博客的话&#xff0c;它还可以有效防止DDOS攻击&#xff01; 准备工作&#xff1a; 需要一个域名&#xff08;推荐N…

UE4开个头-简易小汽车

跟着谌嘉诚学的小Demo&#xff0c;记录一下 主要涉及到小白人上下车和镜头切换操作 1、动态演示效果 2、静态展示图片 3、蓝图-上下车

LoadBalancer (本地负载均衡)

1.loadbalancer本地负载均衡客户端 VS Nginx服务端负载均衡区别 Nginx是服务器负载均衡&#xff0c;客户端所有请求都会交给nginx&#xff0c;然后由nginx实现转发请求&#xff0c;即负载均衡是由服务端实现的。 loadbalancer本地负载均衡&#xff0c;在调用微服务接口时候&a…

turtle绘制小猪佩奇

turtle绘制小猪佩奇 import turtle as t 使用python的turtle绘制小猪佩奇 # 设置线条粗细为4 t.pensize(4) # 使海龟不可见 #t.hideturtle() # 后续表示三原色的r,g,b必须在0~255之间 t.colormode(255) # 设置画笔颜色和填充颜色 t.color((255, 155, 192), "pink")…

单例九品--第五品

单例九品--第五品 上一品引入写在前边代码部分1代码部分2实现方式评注与思考下一品的设计思考 上一品引入 第四品中可能会因为翻译单元的链接先后顺序&#xff0c;造成静态初始化灾难的问题。造成的原因是因为存在调用单例对象前没有完成定义的问题&#xff0c;这一品将着重解…

力扣日记3.8-【回溯算法篇】37. 解数独

力扣日记&#xff1a;【回溯算法篇】37. 解数独 日期&#xff1a;2023.3.8 参考&#xff1a;代码随想录、力扣 37. 解数独 题目描述 难度&#xff1a;困难 编写一个程序&#xff0c;通过填充空格来解决数独问题。 数独的解法需 遵循如下规则&#xff1a; 数字 1-9 在每一行只…

Python 初步了解urllib库:网络请求的利器

目录 urllib库简介 request模块 parse模块 error模块 response模块 读取响应内容 获取响应状态码 获取响应头部信息 处理重定向 关闭响应 总结 在Python的众多库中&#xff0c;urllib库是一个专门用于处理网络请求的强大工具。urllib库提供了多种方法来打开和读取UR…

ViewModel

1.ViewModel的诞生与作用 Activity package com.tiger.viewmodel;import androidx.appcompat.app.AppCompatActivity; import androidx.lifecycle.ViewModelProvider;import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.Te…