【数据结构入门指南】二叉树顺序结构: 堆及实现(全程配图,非常经典)

一文带你详解完全二叉树(超详细) 完全二叉树是一种特殊类型的二叉树,其中树的所有级别都被完全填充,除了最低级别的节点从尽可能左侧填充之外。完全二叉树是一种特殊类型的二叉树,其中树的所有级别都被完全填充,除了最低级别的节点尽可能左侧填充之外。 阅读详情


在这里插入图片描述


一、前言:二叉树的顺序结构

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

在这里插入图片描述


二、堆的概念及结构

堆是一种特殊的数据结构,可以将堆分为大顶堆和小顶堆两种形式。堆中的每个节点都有一个值,并且满足以下两个条件:
 
①:堆的父节点的值总是大于或等于其子节点的值(大顶堆)或者小于或等于其子节点的值(小顶堆)。
②:堆是完全二叉树,即除了最底层外,其他层的节点都是满的,并且最底层的节点都尽量靠左排列。

大(小)堆示意图:

在这里插入图片描述
在这里插入图片描述


三、堆的实现(本篇博客以实现小堆为例)

3.1 准备工作

由于堆是通过数组来实现的,所以我们也和顺序表一样,首先要创建一个结构体来存储:数组指针 + 容量 + 存储数据大小。

代码实现:

typedef int HPDataType;
typedef struct Heap
{
	HPDataType* a;//数组指针
	int size;//存储数据大小
	int capacity;//容量
}HP;

3.2 初始化

初始化有两种方式:
①:初始化时为数组开辟一定大小空间。②:直接将数组指针置为NULL,插入数据过程中在进一步处理。(本篇博客采用第二种)

代码实现:

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

3.3 堆的插入

【代码思路】:
①:在插入数据前,我们首先要判断是否要扩容的问题。由于前面初始化时我们直接置空,所以我们先判断容量是否为空。如果为空开4个空间,否则空间扩大到原来的2倍。(为空时,第一次具体开辟多少空间读者可自行选择,本篇博客开4)
②:接下来就是插入数据了!但有一个问题,直接插入数据可能会破坏堆的结构,所以我们采用了向上调整算法。

代码:

void HPPush(HP* php, HPDataType x)
{
	assert(php);
	//扩容
	if (php->size == php->capacity)
	{
		int newcapacity = php->size == 0 ? 4 : php->capacity * 2;
		HPDataType* tmp = (HPDataType*)realloc(php->a,sizeof(HPDataType) * newcapacity);
		if (tmp == NULL)
		{
			perror("malloc fail");
			exit(-1);
		}
		php->a = tmp;
		php->capacity = newcapacity;
	}
	
	//插入数据
	php->a[php->size] = x;
	php->size++;

	//向上调整
	AdjustUp(php->a, php->size - 1);
}

3.3.1 向上调整算法

【代码思路】:由于插入数据时,影响的只是插入数据到根节点间的关系。所以我们只需将插入数据通过双亲节点调到合适位置即可。
 
Tips:父节点和子节点关系

  • leftchild = parent *2 + 1
  • rightchild = parent * 2 + 2
  • parent = (child - 1)/2

在这里插入图片描述
代码:

void Swap(HPDataType* p1, HPDataType* p2)
{
	HPDataType tmp = *p1;
	*p1 = *p2;
	*p2 = tmp;
}

void AdjustUp(HPDataType* a, int child)
{
	assert(a);
	int parent = (child - 1) / 2;
	while (child > 0)
	{
		if (a[child] < a[parent])//小堆
		{
			Swap(&a[child], &a[parent]);
			child = parent;
			parent = (child - 1) / 2;
		}
		else
		{
			break;
		}		
	}
}

3.4 堆的删除

【代码思路】:堆的删除默认是头删。删除有两种思路:
 
①:将根节点删除,再将其余数据全部向前移动。但这样做会造成一个问题:挪动覆盖导致父子节点的关系全乱了,需要重新建堆。为了删个数据,重新建堆,得不偿失,所以我们采用下面这种方法。
 
②:将堆顶的1数据和最后一个数据交换,在删除最后一个数据。堆顶数据在通过向下调整算法调到合适位置即可。

在这里插入图片描述

代码:

void HPPop(HP* php)
{
	assert(php);
	assert(!HPEmpty(php));//非空,还有数据可删。该接口后面实现
	
	Swap(&php->a[0], &php->a[php->size - 1]);//交换
	php->size--;//删除

	//向下调整
	AdjustDown(php->a, php->size, 0);
}

3.4.1 向下调整算法

【代码思路】:向下调整算法有一个前提:左右子树必须是一个堆,才能调整。同时还要注意是调大堆还是小堆。
调小堆:堆顶元素和孩子中最小的节点比较,如果父节点大于较小的子节点子,两者交换。不断向下调整到合适位置。(调大堆,和较大孩子比较)

在这里插入图片描述

代码:

//这里博主在多说一句,为什么向下调整算法不直接传结构体指针,
//而是分别传数组指针和数据大小呢?
//这里是博主有意为之的,目的在于让向下调整算法通用性更强,在做其他题时,也可以直接调用此接口
void AdjustDown(HPDataType* a, int n, int parent)
{
	assert(a);
	int child = parent * 2 + 1;//假设左孩子更小
	while (child < n)
	{
		//如果右孩子存在,且右孩子更小,则左孩子加1移到右孩子
		if ((child + 1) < n && a[child] > a[child + 1])
		{
			child++;
		}

		if (a[parent] > a[child])//交换
		{
			Swap(&a[parent], &a[child]);
			parent = child;
			child = parent * 2 + 1;
		}
		else
		{
			//父节点小于较小的子节点,说明已经调到合适位置,此时break跳出
			break;
		}
	}
}

3.5 堆的判空(接下的过于简单直接给出代码)

bool HPEmpty(HP* php)
{
	return php->size == 0;
}

3.6 取堆顶的数据

	assert(php);
	assert(!HPEmpty(php));//断言堆中还有元素
	return php->a[0];

3.7 堆的个数

int HPSize(HP* php)
{
	assert(php);
	return php->size;
}

3.8 堆的销毁

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

四、所有代码

Heap.h

#pragma once

#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
#include <stdbool.h>

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

void HPInit(HP* php);//初始化
void HPPush(HP* php, HPDataType x);//插入数据
void HPPop(HP* php);//删除数据
int HPTop(HP* php);//堆顶元素
bool HPEmpty(HP* php);//判空
int HPSize(HP* php);//数据个数
void HPDestory(HP* php);//销毁

Heap.c

#include "Heap.h"

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

void Swap(HPDataType* p1, HPDataType* p2)
{
	HPDataType tmp = *p1;
	*p1 = *p2;
	*p2 = tmp;
}

void AdjustUp(HPDataType* a, int child)
{
	assert(a);
	int parent = (child - 1) / 2;
	while (child > 0)
	{
		if (a[child] < a[parent])//小堆
		{
			Swap(&a[child], &a[parent]);
			child = parent;
			parent = (child - 1) / 2;
		}
		else
		{
			break;
		}
		
	}
}

void AdjustDown(HPDataType* a, int n, int parent)
{
	assert(a);
	int child = parent * 2 + 1;
	while (child < n)
	{
		if ((child + 1) < n && a[child] > a[child + 1])
		{
			child++;
		}

		if (a[parent] > a[child])
		{
			Swap(&a[parent], &a[child]);
			parent = child;
			child = parent * 2 + 1;
		}
		else
		{
			break;
		}
	}
}

void HPPush(HP* php, HPDataType x)
{
	assert(php);
	//扩容
	if (php->size == php->capacity)
	{
		int newcapacity = php->size == 0 ? 4 : php->capacity * 2;
		HPDataType* tmp = (HPDataType*)realloc(php->a,sizeof(HPDataType) * newcapacity);
		if (tmp == NULL)
		{
			perror("malloc fail");
			exit(-1);
		}
		php->a = tmp;
		php->capacity = newcapacity;
	}

	php->a[php->size] = x;
	php->size++;

	//向上调整
	AdjustUp(php->a, php->size - 1);
}


bool HPEmpty(HP* php)
{
	return php->size == 0;
}

void HPPop(HP* php)
{
	assert(php);
	assert(!HPEmpty(php));
	
	Swap(&php->a[0], &php->a[php->size - 1]);
	php->size--;

	//向下调整
	AdjustDown(php->a, php->size, 0);
}

int HPTop(HP* php)
{
	assert(php);
	assert(!HPEmpty(php));
	return php->a[0];
}

int HPSize(HP* php)
{
	assert(php);
	return php->size;
}

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

在这里插入图片描述
在这里插入图片描述

算法-完全二叉树 二叉树作为常见的数据结构,在面试中也经常出现,所以在此记录一些容易忘掉或者容易混淆的二叉树性质和在刷题中碰到的算法。本文仅仅简单介绍了完全二叉树和满二叉树的性质以及如何判断二叉树是否是完全二叉树,而二叉树的类型还有搜索二叉树、平衡二叉树等,之后再遇到二叉树性质相关的题目会再次更新本篇文章。...... 阅读详情

相关推荐

完美二叉树, 完全二叉树和完满二叉树

完美二叉树、完全二叉树和完满二叉树 完美(Perfect)二叉树,完全(Complete)二叉树和完满(Full)二叉树的区别。 树(Tree) 树是由结点或顶点和边组成的(可能是非线性的)且不存在着任何环的一种数据结构。没有结点的树称为空(null或empty)树。一棵非空的树包括一个根结点,还(很可能)有多个附加结点,所有结点构成一个多级分层结构。 树的基本术语 Root 根,树的顶端结点 Child 孩子,当远离根(Root)的时候,直接连接到另外一个结点的结点被称之为孩子(Child); Pare

yake1965 1万+

数据结构之完全二叉树

一、完全二叉树定义 完全二叉树(Complete Binary Tree) 若设二叉树的深度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层所有的结点都连续集中在最左边,这就是完全二叉树。 完全二叉树是由满二叉树而引出来的。对于深度为K的,有n个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n的结点一一对应时称之为完全二叉树。 一棵二叉树至多只有最下面的一层上的结点的度数可以小于2,并且最下层上的结点都集中在该层最左边的若干位置上,而在最后一层上,右边

weixin_45984250的博客 12万+

图的基本知识

文章目录图的基本概念案例引入图的存储结构邻接矩阵无向图的邻接矩阵有向图的邻接矩阵 前面花费了较多的篇幅介绍树和二叉树的相关知识,关于树和二叉树的内容也是较多考试中的重点难点,希望大家读了我的文章后能够快速掌握,这是我写本专栏的初衷。 本篇文章将介绍图的基本知识。 图的基本概念 在前面我们学习了线性表、栈、队列、树,其中线性表、栈和队列属于线性结构,元素之间是一对一的关系;树属于树形结构,元素之间是...

。。。 1273

二叉树(完美二叉树、完全二叉树、完满二叉树)

二叉树(完美二叉树、完全二叉树、完满二叉树)树的概念树的基本术语二叉树(Binary Tree)什么是二叉树(Binary Tree)二叉树的性质完美二叉树(Perfect Binary Tree)完全二叉树(Complete Binary Tree)完满二叉树(Full Binary Tree)比较区分完美二叉树 v.s. 完全二叉树完满(Full)二叉树 v.s. 完全(Complete)二叉...

老人家独爱茉莉的博客 3万+

Allegro老鸟的20年效率秘籍:用YepEda Skill脚本实现PCB设计全流程自动化

本文分享了Allegro资深工程师20年效率秘籍,通过YepEda Skill脚本实现PCB设计全流程自动化。从封装建库到规则配置,再到DFM审核,YepEda Skill大幅提升设计效率,每天节省至少4小时重复劳动。文章详细解析了自动化工具链的核心功能,并提供了实战技巧和量化对比数据。

weixin_42546392的博客 236

基于ESP32的摩托车蓝牙对讲系统开发实践

蓝牙音频传输技术在现代通信中扮演着重要角色,其核心原理是通过无线射频实现数字音频信号的双向传输。在工程实践中,蓝牙HFP协议常用于语音通信场景,而ESP32等嵌入式平台因其低成本和高集成度成为DIY项目的理想选择。本项目通过ESP32-WROOM-32D开发板结合PCM5102 DAC和INMP441数字麦克风等模块,构建了一套摩托车骑行专用的蓝牙对讲系统。该系统特别针对高速移动环境下的风噪抑制和连接稳定性进行了优化,采用数字信号处理技术实现实时降噪,并通过I2S接口确保音频质量。这种方案不仅成本控制在30

weixin_33239721的博客 414

【数据结构入门指南】二叉树

对于深度为K的,有n个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n的结点一一对应时称之为完全二叉树。要注意的是满二叉树是一种特殊的完全二叉树。通常的方法是链表中每个结点由三个域组成,数据域和左右指针域,左右指针分别用来给出该结点左孩子和右孩子所在的链结点的存储地址。也就是说,如果一个二叉树的层数为K,且结点总数是2^k -1,则它就是满二叉树。④: 若规定根节点的层数为1,具有n个结点的满二叉树的深度,h=log。②: 若规定根节点的层数为1,则深度为h的二叉树的最大结点数是2。

Zhenyu_Coder的博客 6666

Teams会议翻译对比测试:Copilot同传 vs 人工翻译,结果出乎意料

本文通过对比测试Microsoft 365 Copilot的实时翻译与专业人工翻译在Teams会议中的表现,揭示了AI同传技术在准确率、响应速度和多语言切换方面的优势与局限。实验数据显示,Copilot在常规商务场景下接近人工翻译水平,且成本效益显著,但在专业术语和文化特定表达上仍需人工辅助。

weixin_29054195的博客 221

【数据结构】二叉树-堆(树的概念、二叉树的概念、顺序结构的结构及实现、堆的实现、堆排序、TopK问题)

本文主要介绍了数据结构的堆(树的概念、二叉树的概念、顺序结构的结构及实现、堆的实现、堆排序、TopK问题),内容全由作者原创(无AI),并带有配图帮助博友们更好的理解,点个关注不迷路,下面进入正文~~

2502_94055806的博客 2814

2025年下半年网络工程师案例分析真题及答案解析

2025年下半年网络工程师案例分析真题及答案解析

鹿鸣天涯 1086

V4L2教程(1):Ubuntu V4L2开发环境搭建与设备探索

欢迎来到V4L2学习指南的第一篇!本文将带你从零开始,在Ubuntu系统上搭建完整的V4L2视频采集开发环境。无论你是想开发视频监控、视频会议还是机器视觉应用,掌握V4L2都是Linux视频开发的必经之路。 **本节学习目标**: - 理解V4L2的基本概念和架构 - 搭建Ubuntu下的V4L2开发环境 - 掌握v4l2-ctl等调试工具的使用 - 学会检测和配置USB摄像头设备

琅嬛福地 417

数据结构——【万字文章+配图+代码】带你深入理解二叉树

二叉树是一种有限集合,由根和左右子树构成,每个结点最多有两棵子树,且这两棵子树具有顺序关系。

勇气是明知不可为而为之 1234

基于毫米波雷达的智能风扇算法设计与实现

摘要:本文设计了一种基于毫米波雷达的智能风扇控制系统,采用FMCW雷达实现人体目标的精准检测与定位。系统通过距离FFT、速度FFT、CFAR检测和AoA估计构建完整的信号处理链路,并针对风扇叶片干扰设计了基于自相关函数的抗干扰算法。创新性地提出了人在开机、多人优先送风、摇头追踪等控制策略。研究采用MATLAB完成全链路算法仿真验证,并在STM32平台上实现实物系统。实验表明,该系统可实现0.15m测距精度和±60°方位角覆盖,有效解决了传统风扇的能源浪费和用户体验问题。本文提供了完整的MATLAB仿真代码和

huanghm88的专栏 403

【数据结构与算法】(10):堆的创建和删除、向下调整和向上调整

堆的向上调整、堆的向下调整、堆排序、堆的顺序存储、堆的链式存储、TOP-K问题

更新C/C++,数据结构与算法,计算机视觉,深度学习,目标检测 836

Android/Linux驱动开发:使用dev_dbg进行设备驱动调试

在本文中,我们将介绍如何使用dev_dbg宏和相关的函数来进行设备驱动调试。函数在该目录下创建了一个名为"debug"的debugfs文件。在这些函数中,您可以执行与您的设备驱动相关的调试操作。函数在该目录下创建了一个名为"debug"的debugfs文件。在这些函数中,您可以执行与您的设备驱动相关的调试操作。的结构体指针,其中包含了我们定义的文件操作函数。的结构体指针,其中包含了我们定义的文件操作函数。在上面的示例中,我们首先通过调用。在上面的示例中,我们定义了。在上面的示例中,我们定义了。

ByteKnight的博客 372

一键开关机电路

一键开关机电路

让你爱上电路设计 4174

Java api05(collection集合 list set queue 底层实现原理 数据结构二叉树)(文字配图)

集合: Collection(I) + Map(I) Collection(I): |- List(I) - 顺序结构 |- ArrayList© - 数组 |- LinkedList© - 链表 |- Vector© - 数组 |- Set(I) - 散列结构 -> Map(I) |- SortedSet(I) |- TreeSet© |- hashSet© |- Queue(I) - 队列 |- Dueque(I) |-LinkedList© List集合 - 顺序结构 1.List集合的特点 a

xujiaqiqiqi的博客 245

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

完全二叉树、搜索二叉树、平衡二叉树和满二叉树(C++)

完全二叉树是这样定义的:若二叉树的深度为 h,除第 h 层外,其它各层的结点数都达到最大个数,第 h 层所有的叶子结点都连续集中在最左边,这就是完全二叉树。(第 h 层可能包含 [1~2h] 个节点)上面的定义看起来比较复杂。所有节点只存在3种情况:1、有左右2个孩子;2、只有左孩子;3、没有孩子(叶节点),即不存在只有右孩子的情况;我们采用层序遍历的方式遍历节点,当遍历到某一个节点,它只有左孩子,或者没有孩子,则后序所有节点一定都是叶节点。如下所示是完全二叉树节点的左子树只包含小于当前节点的数。

ymhdt的博客 1万+

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

完全二叉树(Complete Binary Tree)和满二叉树(Full Binary Tree)的异同解释及其相关代码

完全二叉树是指除了最后一层外,其他层的节点都必须填满,并且最后一层的节点从左到右连续地排列。换句话说,除了最后一层外,每一层都是满的,最后一层上的节点都尽可能地靠左排列。完全二叉树不一定是满的,即最后一层可能不完全填满。满二叉树是指每一层的节点都是满的,即每个节点都有两个子节点(除了最后一层外)。满二叉树的节点数满足关系式: N = 2^h - 1,其中 N 是满二叉树的节点数,h 是满二叉树的高度。最后一层节点不是满的,但节点的排列是从左到右连续的。每一层的节点都是满的,每个节点都有两个子节点。

Kegi_的博客 4685

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

完全二叉树你需要了解一下

完全二叉树(Complete Binary Tree)是一种特殊的二叉树,它的定义是:如果设二叉树的深度为h,除第h层外,其它各层(1~h-1)的结点数都达到最大个数,第h层所有的结点都连续集中在最左边,这就是完全二叉树。完全二叉树的性质包括:深度为k的完全二叉树,节点数在2k到2k+1−1之间。若根节点编号为1,则第i个节点的编号为i。对于任意一节点i,其左儿子的编号为2i,右儿子的编号为2i+1。如果i不是根节点,它的父节点编号为i/2(向下取整)。

技术人集结地 4642

满二叉树、完全二叉树、完美二叉树的区别

满二叉树、完全二叉树、完美二叉树的区别

m0_45906029的博客 3030

完全二叉树

一,满二叉树 除最后一层无任何子节点外,每一层上的所有结点都有两个子结点的二叉树,叫满二叉树。 也就是说,如果一个二叉树的层数为k,且结点总数是(2^k) -1 ,则它就是满二叉树,反之亦然。 二,完全二叉树 一棵有n个结点的二叉树,对树中的结点按从上至下、从左到右的顺序进行编号,如果编号为i(1≤i≤n)的结点与满二叉树中编号为i的结点在二叉树中的位置相同,则这棵二叉树称为完全二叉树。 满二叉树是完全二叉树中的一种特例。 三,完全二叉树的性质 除根节点外,节点n的父节点...

nameofcsdn的博客 6654

树、二叉树(完全二叉树、满二叉树)概念图解

1、树的定义 树是n个结点的有限集合,有且仅有一个根结点,其余结点可分为m个根结点的子树。 2、树的概念 结点的度:一个结点拥有子树的个数称为度。比如A的度为3,C的度为2,H的度为0。度为0的结点称为叶子节点(D,F,G,H)。树的度是树中所有结点的度的最大值,此树的度为3。 树中结点的最大层次成为树的深度或高度。此树的深度为4。 父节点A的子结点B,C,D;B,C,D也是兄弟节点...

摸金校尉的博客 8万+

完全二叉树简析

摘要:解释了数据结构树中的重要形态之完全二叉树

云杉木屋 1万+

完全二叉树、完美二叉树、完满二叉树、计算完全二叉树的结点

完美二叉树是一种特殊的完全二叉树,每层都是满的,像一个稳定的三角形全二叉树从根结点到倒数第二层满足完美二叉树,最后一层可以不完全填充,其叶子结点都靠左对齐。其实理解完全二叉树可以借助于**栈(stack)**的思想。具体就是我们可以将一棵完美二叉树的所有节点按照编号1…15的顺序依次入栈。然后对栈每一次出栈,栈里保存的结点集构造一棵二叉树都是一棵完全二叉树。

weixin_52055811的博客 3669

树、二叉树、完全二叉树、满二叉树的概念和性质

一、树的概念及其结构 树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。 树的特点 ①有一个特殊的结点,称为根结点,根节点没有前驱结点 。 ②除根节点外,其余结点被分成M(M>0)个互不相交的集合T1、T2、……、Tm,其中每一个集合Ti(1<= i<= m)又是一棵结构与树类似的子树。每棵子树的根结点有且只有一个前驱,可以有0个或多个后继 ③因此,树是递归.

想要上进的coder的博客 1万+
上一篇: 【二叉树前沿篇】树
下一篇: 【数据结构入门指南】二叉树
小白debug~
小白debug~ 新星创作者: C/C++技术领域 新星创作者: C/C++技术领域
博客等级 码龄4年 3510粉丝 128原创
评论 137
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小白debug~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值