了解二叉树的一系列,创建遍历,删除等

二叉树的创建、插入和删除 二叉树的创建、插入和删除 什么是二叉树 我们把每个节点最多有两个子节点的树称为二叉树,即英文的Binary Tree。我们把这两个子节点分别叫做左子节点和右子节点。一般来说,二叉树的节点包括以下的内容: 数据 左子节点引用/指针 右子节点引用/指针 可以用以下的JavaScript代码表示二叉树的节点: class BinaryTreeNode { constructor(data, ... 阅读详情

什么是二叉树: 在计算机科学中,二叉树是每个结点最多有两个子树的树结构。通常子树被称作“左子树”(left subtree)和“右子树”(right subtree)。
如图所示
在这里插入图片描述
关于树的术语

树的结点(node):包含一个数据元素及若干指向子树的分支;

孩子结点(child node):结点的子树的根称为该结点的孩子;

双亲结点:B 结点是A 结点的孩子,则A结点是B 结点的双亲;

兄弟结点:同一双亲的孩子结点;堂兄结点:同一层上结点;

祖先结点: 从根到该结点的所经分支上的所有结点

子孙结点:以某结点为根的子树中任一结点都称为该结点的子孙

结点层:根结点的层定义为1;根的孩子为第二层结点,依此类推;

树的深度:树中最大的结点层

结点的度:结点子树的个数

树的度:树中最大的结点度。

叶子结点:也叫终端结点,是度为 0 的结点;

分枝结点:度不为0的结点;

有序树:子树有序的树,比如家族树;

无序树:不考虑子树的顺序;

给定一个二叉树,找出其最大深度。二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。
在这里插入图片描述
每个节点的深度与它左右子树的深度有关,且等于其左右子树最大深度值加上 1。即:
maxDepth(root) = max(maxDepth(root.left),maxDepth(root.right)) + 1
以 [3,9,20,null,null,15,7] 为例:
在这里插入图片描述
由此我们可以得到根节点的最大深度为
maxDepth(root-3)
=max(maxDepth(sub-4),maxDepth(sub-20))+1
=max(1,max(maxDepth(sub-15),maxDepth(sub-7))+1)+1
=max(1,max(1,1)+1)+1
=max(1,2)+1
=3
因此求最大深度就可以用递归来实现,不断遍历该树的左右子树最后判断谁最大
在递归中,如果层级过深,我们很可能保存过多的临时变量,导致栈溢出。这也是为什么我们一般不在后台代码中使用递归的原因
事实上,函数调用的参数是通过栈空间来传递的,在调用过程中会占用线程的栈资源。而递归调用,只有走到最后的结束点后函数才能依次退出,而未到达最后的结束点之前,占用的栈空间一直没有释放,如果递归调用次数过多,就可能导致占用的栈资源超过线程的最大值,从而导致栈溢出,导致程序的异常退出。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
二叉树也有很多性质
二叉树有以下几个性质:
性质1:二叉树第i层上的结点数目最多为 2^{i-1} (i≥1)。
性质2:深度为k的二叉树至多有2^{k}-1个结点(k≥1)。
性质3:包含n个结点的二叉树的高度至少为log2 (n+1)。
性质4:在任意一棵二叉树中,若终端结点的个数为n0,度为2的结点数为n2,则n0=n2+1。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
顺序结构中找孩子容易 孩子的节点分别是2i 和 2i+1
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
二叉树中常用的三种遍历方式
第一种 前序遍历又称 先序遍历 根左右
在这里插入图片描述

void PreOrder(BTNode *b)
{  if (b!=NULL)  
   {  printf("%c ",b->data); 	//访问根结点
      PreOrder(b->lchild);
      PreOrder(b->rchild);
   }
}

第二种中序遍历 左根右
在这里插入图片描述

void InOrder(BTNode *b)
{  if (b!=NULL)  
   {  InOrder(b->lchild);
      printf("%c ",b->data); 	//访问根结点
      InOrder(b->rchild);
   }
}

第三种后序遍历 左右根
在这里插入图片描述

void PostOrder(BTNode *b) 
{  if (b!=NULL)  
   {  PostOrder(b->lchild);
      PostOrder(b->rchild);
      printf("%c ",b->data); 	//访问根结点
   }
}

在这里插入图片描述
对应的递归算法如下

int Nodes(BTNode *b)
{  
   if (b==NULL) 
      return 0;
   else
      return Nodes(b->lchild)+Nodes(b->rchild)+1
}

在这里插入图片描述

在这里插入图片描述

void DispLeaf(BTNode *b)
{  if (b!=NULL)
   {  if (b->lchild==NULL && b->rchild==NULL)
	  printf("%c ",b->data);     //访问叶子结点
      DispLeaf(b->lchild);	        //输出左子树中的叶子结点
      DispLeaf(b->rchild);	        //输出右子树中的叶子结点
   }
}

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

A进栈 A出栈 C进栈 B进栈 B没有右孩子,B出栈 D进栈 D出栈 G进栈 G出栈
C出栈 F进栈 E进栈 E出栈 F出栈
算法如下

void PreOrder1(BTNode *b)
{  BTNode *p;
   SqStack *st;			//定义栈指针st
   InitStack(st);			//初始化栈st
   if (b!=NULL) 
   {  Push(st,b);			//根结点进栈
      while (!StackEmpty(st))		//栈不为空时循环
      {  Pop(st,p);			//退栈结点p并访问它
	  printf("%c ",p->data);
	  if (p->rchild!=NULL)	//有右孩子时将其进栈
	     Push(st,p->rchild);
	  if (p->lchild!=NULL)	//有左孩子时将其进栈
            Push(st,p->lchild);
      }
      printf("\n");
   }
   DestroyStack(st);			//销毁栈
}


在这里插入图片描述

void InOrder1(BTNode *b)
{  BTNode *p;  SqStack *st;	//定义一个顺序栈指针st
   InitStack(st);		//初始化栈st
   p=b;
   while (!StackEmpty(st) || p!=NULL)
   {  while (p!=NULL)		//扫描结点p的所有左下结点并进栈
      {  Push(st,p);		//结点p进栈
	  p=p->lchild;		//移动到左孩子
      }
      //以下考虑栈顶结点
      if (!StackEmpty(st))	//若栈不空
      {  Pop(st,p);		//出栈结点p,访问结点p
	  printf("%c ",p->data);
	  p=p->rchild;		//转向处理其右子树
      }
   }
   printf("\n");
   DestroyStack(st);		//销毁栈
}

在这里插入图片描述

void PostOrder1(BTNode *b)	//后序非递归遍历算法
{  BTNode *p,*r;
   bool flag;
   SqStack *st;		//定义一个顺序栈指针st
   InitStack(st);		//初始化栈st
   p=b;
   do
   {  while (p!=NULL)		//扫描结点p的所有左下结点并进栈
      {  Push(st,p);		//结点p进栈
	  p=p->lchild;		//移动到左孩子
      }
      r=NULL;			//r指向刚刚访问的结点,初始时为空
      flag=true;		
while (!StackEmpty(st) && flag)
     {  GetTop(st,p);	         //取出当前的栈顶结点p
        if (p->rchild==r)      //若结点p的右孩子为空或者为刚访问结点       
        {  printf("%c ",p->data);     //访问结点p
	    Pop(st,p);
	    r=p;		 //r指向刚访问过的结点
        }
        else
        {  p=p->rchild;	//转向处理其右子树
	    flag=false;	//表示当前不是处理栈顶结点
        }
     }
   } while (!StackEmpty(st));	//栈不空循环
   printf("\n");
   DestroyStack(st);		//销毁栈
}

以上的非递归思想都是建立于各种遍历的访问方法上
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

typedef struct 
{  BTNode *data[MaxSize];	//存放队中元素
   int front,rear;		//队头和队尾指针
} SqQueue;
void LevelOrder(BTNode *b)
{  BTNode *p;
   SqQueue *qu;			//定义环形队列指针
   InitQueue(qu);			//初始化队列
   enQueue(qu,b);			//根结点指针进入队列
   while (!QueueEmpty(qu))		//队不为空循环
   {  deQueue(qu,p);			//出队结点p
      printf("%c ",p->data);		//访问结点p
      if (p->lchild!=NULL)		//有左孩子时将其进队
	  enQueue(qu,p->lchild);
      if (p->rchild!=NULL)		//有右孩子时将其进队
	  enQueue(qu,p->rchild);
    } 
}

二叉树的构造
在这里插入图片描述
先序和中序

BTNode *CreateBT2(char *post,char *in,int n)
{  BTNode *b;  char r,*p;  int k;
   if (n<=0) return NULL;
   r=*(post+n-1);			     //根结点值
   b=(BTNode *)malloc(sizeof(BTNode));    //创建二叉树结点b
   b->data=r;
   for (p=in;p<in+n;p++)		     //在in中查找根结点
      if (*p==r) break;
   k=p-in;				     //k为根结点在in中的下标 
   b->lchild=CreateBT2(post,in ,k);  
   b->rchild=CreateBT2(post+k,p+1 ,n-k-1); 
}

在这里插入图片描述
创建二叉树可以用 括号表示法创建,也可以用 前序中序 ,或者中序后续来创建二叉树

#include <iostream>
using namespace std;
typedef  struct node 
{
 char data;
 struct node *lchild;
 struct node *rchild;
}BTNODE;
void CreateBTree(BTNODE * &b,char *str)
{
	BTNODE *St[50],*p;
	int top =-1,k,j=0;
	char ch;
	b=NULL;
	ch=str[j];
	while(ch!='\0')
	{
	   switch (ch)
	   {
     	   case'(': top++;St[top]=p;k=1;break;
	       case')':top--;break;
		   case',':k=2;break;
		   default :p=(BTNODE*)malloc(sizeof(BTNODE));
			   p->data=ch;
			   p->lchild =p->rchild =NULL;
			   if(b==NULL)
				   b=p;
			   else
			   {
			      switch (k)
				  {
				  case 1:St[top]->lchild =p;break;
				  case 2:St[top]->rchild =p;break;
				  }			   
			   } 
	   }
	   j++;
	ch=str[j];
	}
}
void PreOrder(BTNODE * b)
{
  if(b!=NULL)
  {
    printf("%c->",b->data );
    PreOrder(b->lchild );
    PreOrder(b->rchild );
  }
}
void InOrder(BTNODE * b)
{
  if(b!=NULL)
  {
		InOrder(b->lchild );
	     printf("%c->",b->data );
		InOrder(b->rchild );  
  }
}
void PostOrder(BTNODE * b)
{
  if(b!=NULL)
  {
		PostOrder(b->lchild );
	   PostOrder(b->rchild );
		printf("%c->",b->data ); 
  }
}
void DispLeaf(BTNODE *b)
{
  if(b!=NULL)
  {
    if(b->lchild ==NULL&&b->rchild ==NULL)
		printf("%c->",b->data );
	DispLeaf(b->lchild );
	DispLeaf(b->rchild );
  }
}
int main()
{
	BTNODE * b;
	char str[]={'A','(','B','(','D',',','E','(','H','(','J',',','K','(','L',',','M','(',',','N',')',')',')',')',')',',','C','(','F',',','G','(',',','I',')',')',')'};
	CreateBTree(b,str);
	printf("先序遍历的结果如下");
	 PreOrder( b);
	printf("\n");
	 printf("中序遍历的结果如下");
	 InOrder( b);
	 printf("\n");
	printf("后序遍历的结果如下");
	PostOrder( b);
	printf("\n");
	printf("所有的叶子结点的结果如下");
	DispLeaf(b);
	printf("\n");
	return 0;
}

在这里插入图片描述
在这里插入图片描述
二叉树的销毁
在这里插入图片描述
查找二叉树中的某个节点
在这里插入图片描述
输出二叉树,也可以用 前序中序后续来输出
在这里插入图片描述
最后关于二叉树的实际应用 ,参考这篇文章,这篇文章说的很详细,例如二叉排序树,平衡二叉树,二叉搜索树等
https://mp.weixin.qq.com/s?__biz=Mzg2NzA4MTkxNQ==&mid=2247487396&idx=2&sn=f4da5c1b78713d24abe715466cb153d3&chksm=ce404470f937cd6674273c20755bf760294ad6cdabbc0b358a8c12297db9063c43a7f383ddac&mpshare=1&scene=23&srcid=0517fE7g8NAdS1e0QcjMggx4&sharer_sharetime=1589710839347&sharer_shareid=ac11f0b33b3f01f55650b6c5eeb96ac0#rd

数据结构—遍历、创建二叉树 1.遍历二叉树算法描述 遍历二叉树( traversing binary tree)是指按某条搜索路径巡访树中每个结点,使得每个结点均被访问一次,而且仅被访问一次。访问的含义很广,可以是对结点做各种处理,包括输出结点的信息,对结点进行运算和修改等。 遍历二叉树是二叉树最基本的操作,也是二叉树其他各种操作的基础,遍历的实质是对二又树进行线性化的过程,即遍历的结果是将非线性结构的树中结点排成一个线... 阅读详情

相关推荐

Python实现二叉树的增加、删除、层次遍历、先序/后序/中序遍历

学过数据结构的同学一定这种数据结构非常熟悉了,树是一种非常高效的非线性存储结构,学好树对理解一些复杂的算法非常有帮助。树有以下内容需要掌握: 树、二叉树 二叉查找树 平衡二叉查找树、红黑树 递归树 作为一名 Python 程序员,如果把基础的数据结构与算法都自己亲自实现一遍,那么你已经比 90% 的 Python 程序员更优秀了。 今天的我们的目标是使用 Python 来实现一棵二叉树。 二叉...

somenzz的博客 1833

数据结构③:二叉树的操作

(1)输入完全二叉树的先序序列,用#代表虚结点(空指针),如ABD###CE##F##,建立二叉树的二叉链表。 (2)写出对用二叉链表存储的二叉树进行先序、中序和后序遍历的递归和非递归算法。(3)写出对用二叉链表存储的二叉树进行层次遍历算法。 (4)求二叉树的所有叶子及结点总数。 (5)求二叉树的深度。 代码: #include<stdio.h> #include<stdlib....

学徒 1011

GO与KEGG富集分析实战:从差异基因到功能注释

本文详细介绍了GO与KEGG富集分析的完整实战流程,从差异基因列表出发,通过基因ID转换、核心分析到结果可视化,系统阐述了如何将基因数据转化为生物学洞察。文章重点讲解了使用R语言clusterProfiler包进行GO和KEGG富集分析的具体步骤、参数设置及常见问题解决方案,并强调了结果解读与生物学故事构建的方法,帮助研究者深入理解差异基因的集体功能倾向。

weixin_29291863的博客 918

数据结构考题汇总(C语言版, 附代码)

数据结构考题 本人从严书筛选出的,从热门更新到冷门知识,本人思路是先掌握简单易拿分的项目再去攻克不好拿的。适用于各大高校考研初试复试的数据结构题目。后面会更新面试答题部分。

qq272437543的博客 1万+

智能车实战——从ADC采集到PWM控制,让电磁车精准循迹

本文详细介绍了电磁循迹智能车的实现原理与实战技巧,涵盖从ADC信号采集、PWM控制到PID算法整定的全流程。通过STM32代码示例解析电感信号处理、差比和偏差计算及电机驱动等关键技术,帮助开发者快速掌握智能车精准循迹的核心方法,提升电磁车竞赛项目的开发效率。

weixin_29192211的博客 301

LangGraph实战训练营-从零构建AI驱动的wiki知识库

本文深入解析 LangChain 团队开源的 Deep Agents 框架核心示例——LLM Wiki,一个基于大语言模型自动构建和维护持久化知识库的生产级 AI Agent 系统。文章从项目架构、环境搭建、核心原理到实战操作全面展开:详解 CompositeBackend 组合后端与细粒度权限控制的安全设计、四种工作模式(初始化/摄取/查询/质量检查)的完整流程、LangSmith 远程沙箱的隔离执行机制,以及人机协同审核(HITL)的实践应用。

program哲学 198

【数据结构】实验八 树的基本操作和遍历

实验要求: 1、前序遍历生成二叉树; 2、前序、中序、后序遍历上述生成的二叉树(使用递归); 3、使用非递归方式中序遍历二叉树; 4、输出二叉树的深度、节点个数。 #include<iostream> #define TElemType char #define ElemType BiTree #define MAXSIZE 1000 using namespace std; typedef struct BiTNode // 二叉树的二叉链表存储表示 { TElemType data;.

weixin_61693556的博客 731

OpenClaw人人养虾:配置通义千问(Qwen)

通义千问(Qwen)是阿里云推出的大语言模型系列。OpenClaw 支持通过 Qwen Portal 插件实现 OAuth 免费额度认证,每日可免费使用 2000 次请求,无需绑定支付方式。

王国平的博客 1257

二叉树遍历算法

void PreOrderUnrec(Bitree *t) { Stack s; StackInit(s); Bitree *p=t; while (p!=NULL || !StackEmpty(s)) { while (p!=NULL) //遍历左子树 { visit

花落留香 846

华为OD机试双机位C卷-敌情监控 (Py/Java/C/C++/Js/Go)

华为OD机试(机考)双机位C卷 【敌情监控】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试 - 敌情监控。

qq_45776114的博客 938

如何解决群晖Docker注册表查询失败/无法拉取镜像等问题

如何解决群晖Docker注册表查询失败/无法拉取镜像等问题

XiaoqiangClub的博客 1万+

输出二叉树的叶子

输出二叉树的叶子

wxmndtf的博客 405

YOLOv12涨点改进 | CVPR 2026 |独家创新首发、特征融合改进篇 | 引入Local Attender 局部注意力算子融合模块,高效捕捉小目标和密集目标的局部上下文特征,助力高效涨点

🚀本文提出LocalAttender模块改进YOLOv12模型,通过局部注意力机制解决传统上采样方法的语义漂移问题。该模块采用固定偏移邻域加权聚合方式,在保持线性计算复杂度的同时有效捕捉小目标和密集目标的局部特征。实验表明,LocalAttender能显著提升检测精度而不增加过多计算负担,且与YOLOv12兼容性强。文章详细介绍了模块原理、实现方法和配置步骤,并提供了两种改进方案的具体yaml配置文件。这一创新为提升目标检测性能提供了高效解决方案。

Ai缝合怪、助力小伙伴高效发论文 118

Python 实现二叉树的创建、二叉树的添加、二叉树的删除、二叉树的修改、二叉树的查找、二叉树的的遍历 最详细的二叉树 增 删 改 查

Python 实现二叉树的创建、添加、删除、修改、查找

storyfull 2301

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

详解二叉树的创建,遍历,查找,删除子树

链式存储创建二叉树: 创建一棵树: public static void main(String[] args) { //创建一棵树 BinaryTree binTree = new BinaryTree(); } 这样就完成了一棵树的创建,可能大家会疑惑,这里面什么都没有,怎么叫创建一棵树呢? 这其实就是一颗空树 二叉树的全部代码: /** * 2019年2月15日 */ p...

Guo_ping'blog 2604

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

C++实现二叉树的插入、删除、查询、遍历

1.二叉树的概念        树是一些节点的集合,节点之间用边链接,节点之间不能有环路。上层的节点称为父节点,下层节点称为子节点。最上层的节点称为根节点。       二叉树是特殊的树。对于每个节点而言,与之直接相连的子节点不能超过两个(可以为0)。左边的子节点称为左子树,右边的子节点称为右子树。如下图就是一颗二叉树: 与树相关的一些概念:          没有任何子节点的节点

远走的兔子博客 4万+

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

二叉树(排序树)的创建、遍历、插入、删除以及查找

二叉树(排序树)的创建、遍历、插入、删除以及查找 原理:二叉树的先序创建(递归)按先序遍历的顺序,依次 输入结点的信息建成立二叉链表的算法。该算法的基本思想是:首先对一般的二叉树添加若干个虚结点,使每一个节点都有左右两个孩子,然后依次输入结点信息。若输入的结不是虚结点,则建立一个新结点;先序创建左子树;先序创建右子树 在这里插入代码片 ...

weixin_43126491的博客 3759

二叉树遍历、插入、删除等常见操作

1.二叉查找树的创建 2.二叉查找树清空 3.二叉查找树查询 4.查找最大值、最小值 5.二叉查找树插入操作 6.二叉查找树的删除操作 7.分别使用非递归和递归方式(部分用多种方式)实现树的先序遍历、中序遍历和后序遍历

Sunshine的专栏 1万+

二叉树的创建、遍历、查找、删除

我们最初学习数据结构的时候,肯定是先从线性结构和链式结构讲起,回顾一下他们的特点。 线性结构以数组为例,它通过下标的方式访问元素,访问速度很快,但是当我们向数组中插入或删除某个元素时,会将插入位置的元素整体移动,从而造成效率低下。 链式结构以单链表为例,它在插入或删除元素时,只改变链表的指向并且不移动元素,能够解决线性结构插入或删除元素效率不足的问题,但是当我们需要访问某个元素时,只能从单链表...

陈同学 664

二叉树总结创建,遍历

二叉树作为树的一种,是一种重要的数据结构,二叉树中的面试题比较常见的题型大概有下面几个:创建一颗二叉树(先序,中序,后序)、遍历一颗二叉树(先序,中序,后序和层次遍历)、求二叉树中叶子节点的个数、求二叉树的高度、求二叉树中两个节点的最近公共祖先、打印和为某一值的全部路径、求某一节点是否在一个树中等等。

heyuchang666的专栏 1万+

二叉树的层次遍历(C语言)

一、二叉树的概念以及结构 二叉树是n(n>=0)个节点的有限集合,该集合或者为空集(称为空二叉树),或者由一个根节点和两棵互不相交的、分别称为根节点的左子树和右子树组。 二、二叉树的遍历图解 先序遍历 中序遍历 后序遍历 层次遍历 ...

chenshengnanii的博客 2万+

MFC二叉树可视化绘制 (C++)—— 插入、删除、先序遍历、中序遍历、后序遍历、层序遍历(基于平衡二叉树实现)

一、实现功能 实现操作:结点的插入、删除。 实现输出:输出先序遍历、中序遍历、后序遍历、层序遍历的结果。 二、代码设计 1. 定义平衡二叉树的结点结构

demo_yo的博客 4186

二叉树遍历与删除

前面写过二叉树的节点插入与查找关键数据项以及最值的数据项。二叉树的删除与遍历是另外一项重要的操作。特别是二叉树的人删除比较复杂,分为无子节点的节点删除,只有一个子节点的节点删除和有两个子节点的节点删除三种情况。1. 删除没有子节点的节点      这种情况是三种节点删除中最简单的。因为没有子节点的节点删除时只需要将该节点的左或者右节点的引用置为null即可。其他的基本不用变。可以下图表示:原始二叉树

Richard_Cai 9265

二叉树的基本内容(创建,遍历,节点个数,深度计算)

二叉树从创建到销毁,满满的递归!

qq_52777887的博客 5712

二叉树的创建遍历应用删除

二叉树的创建 typedef struct Bitree { char data; struct Bitree* lchild;//创建左孩子结点 struct Bitree* rchild;//创建右孩子结点 }BiTree; BiTree *createBiTree(BiTree *bt) { char c; cin >> c; if (c == '#') bt ...

吹灭读书灯 一身都是月的博客 256
上一篇: 力扣 34.在排序数组中查找元素的第一次出现的位置为最后一次出现的位置
下一篇: LeetCode 39. 组合总和(DFS和剪枝)
凌晨里的无聊人
博客等级 码龄8年 2320粉丝 206原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

凌晨里的无聊人

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

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

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

打赏作者

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

抵扣说明:

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

余额充值