数据结构小记【Python/C++版】——树与二叉树篇

Python 树结构库treelib使用教程 树结构是一种常见且重要的数据结构。Python中的treelib库是对树结构的有效实现。在 treelib 库中,实现了两个类Tree和Node,分别用于创建多叉树和创建节点。 阅读详情

一,树的简介

树结构的形状很像现实生活中一棵倒置的大树。

树结构是由一堆节点和边组成的具有层级关系的非线性数据结构。

树顶部的节点被称为根节点,它通常是搜索、遍历等操作的起始位置。

树结构在很多地方都有应用,比如操作系统中的文件结构。

树的常见概念:

根节点(Root):树的最顶层节点。

父节点(Parent Node):节点沿着边往上一层的节点称为该节点的父节点。

子节点(Child Node):节点沿着边往下一层的节点称为该节点的子节点。

兄弟节点(Sibling):同一个父节点的子节点互为兄弟节点。

边(Edge):父节点和子节点之间连接,形成边。

叶子节点(Leaf):没有子节点的节点称为叶子节点或者叶节点。

子树(Subtree):以某个子节点为根节点的树分支。

节点的深度(Depth):是指从根节点到该节点的距离。

节点的高度(Height):该节点到叶子节点的最长距离。

树的高度(Height of tree):根节点到叶子节点的最长距离。

节点的层级(Level):该节点的父节点数量+1。

节点的度(Degree):该节点的子节点数量。

二,二叉树的基础概念

每个节点最多有两个子节点的树被称为二叉树。

在给定的二叉树中,任何级别的最大节点数为 2 l-1,其中"l"是级别编号。

树有很多种,二叉树只是其中一种典型结构,二叉树与其他种类树的区别:

1.有些树的每个节点可以有若干个子节点,而二叉树的每个节点最多只能有两个子节点。

2.有些树的每个节点的子节点之间可以是无序的,两个子节点之间甚至可以交换位置。而(有序)二叉树中,每个节点的子节点之间需要区分是左子节点还是右子节点,即使整棵树就两个节点。

三,二叉树的图示结构与分类

(1),满二叉树(full binary tree)

每个节点都有0个或2个子节点的二叉树称为满二叉树。

满二叉树除叶子节点以外,所有节点都有两个子节点。

(2),完美二叉树(perfect binary tree)

所有的叶子节点都在同一层。

所有内部节点都必须有两个子节点。

(3),完全二叉树(complete binary tree)

完全二叉树除了最后一层之外的所有层次都被填满,最后一层有的位置只有左节点。

注意,满二叉树是特殊的完全二叉树。

四,二叉树的常见表示方式

方式一,链式存储——用链表结构来表示二叉树

此时的二叉树被视为节点的集合。       

链表节点的构成:             

 左指针,指向节点的左子节点的指针。           

 数据域,节点存储的实际数据。           

 右指针,指向节点的右子节点的指针。

如果给定节点没有子节点,或者该节点就是叶子节点,则该节点的左右指针设置为空null。

代码实现时,只需要先定义好根节点,等后面添加新节点进来时,再给新节点的左右指针进行赋值,这棵树就慢慢成形了。

方式二,顺序存储——用数组结构来表示二叉树

定义一个数组,用于存储树的所有节点。

树中的节点数决定了数组的大小。

数组的第一个位置存储根节点。

如果一个节点存储在第i位置,那么它的左子节点和右子节点分别存储在第2i和第2i+1位置。

Demo1.链式存储代码实现

1.二叉树初始化: 

Python实现:

class Node:
    def __init__(self, key):
        self.left = None
        self.right = None
        self.val = key

C++实现:

//方式一,利用结构体实现
struct node {
    int data;
    struct node* left;
    struct node* right;
};

//方式二,利用类实现
class Node {
public:
    int data;
    Node* left;
    Node* right;
};

2.完整代码

Python实现:

class Node:
    def __init__(self, key):
        self.left = None
        self.right = None
        self.val = key


if __name__ == '__main__':
    #root node
    root = Node(1)
    root.left = Node(2)
    root.right = Node(3)
    root.left.left = Node(4)
    '''
             1
           /   \
         2       3
        / \     / \
       4 None  None None
      / \
    None None
    '''

C++实现:

#include <bits/stdc++.h>
using namespace std;
class Node {
public:
    int data;
    Node* left;
    Node* right;
    Node(int val)
    {
        data = val;
        left = NULL;
        right = NULL;
    }
};
int main()
{
    //root node
    Node* root = new Node(1);
    root->left = new Node(2);
    root->right = new Node(3);
    root->left->left = new Node(4);
    return 0;
    /*

             1

           /   \

         2       3

        / \     / \

       4 NULL NULL NULL

      / \

    NULL NULL

    */
}

Demo2.顺序存储代码实现

Python实现: 

tree = [None] * 10

def root(key):
   if tree[0] != None:
      print("Tree already had root")
   else:
      tree[0] = key

def set_left(key, parent):
   if tree[parent] == None:
      print("Can't set child at", (parent * 2) + 1, ", no parent found")
   else:
      tree[(parent * 2) + 1] = key

def set_right(key, parent):
   if tree[parent] == None:
      print("Can't set child at", (parent * 2) + 2, ", no parent found")
   else:
      tree[(parent * 2) + 2] = key

root('A');
set_left('B', 0);
set_right('C', 0);
set_left('D', 1);
set_right('E', 1);
set_right('F', 2);
print(tree)

'''

            A(0)

         /      \

        B(1)     C(2)

      /   \        \

     D(3)  E(4)    F(5)

运行结果:

['A', 'B', 'C', 'D', 'E', None, 'F', None, None, None]

C++实现:

#include<bits/stdc++.h>
using namespace std;
char tree[10];
int root(char key) {
    if (tree[0] != '\0')
        cout << "Tree already had root";
    else
        tree[0] = key;
    return 0;
}
int set_left(char key, int parent) {
    if (tree[parent] == '\0')
        cout << "\nCan't set child at "
        << (parent * 2) + 1
        << " , no parent found";
    else
        tree[(parent * 2) + 1] = key;
    return 0;
}
int set_right(char key, int parent) {
    if (tree[parent] == '\0')
        cout << "\nCan't set child at "
        << (parent * 2) + 2
        << " , no parent found";
    else
        tree[(parent * 2) + 2] = key;
    return 0;
}
int print_tree() {
    cout << "\n";
    for (int i = 0; i < 10; i++) {
        if (tree[i] != '\0')
            cout << tree[i];
        else
            cout << " ";
    }
    return 0;
}
int main() {
    root('A');
    set_left('B', 0);
    set_right('C', 0);
    set_left('D', 1);
    set_right('E', 1);
    set_right('F', 2);
    print_tree();
    return 0;
    /*
            A(0)
         /      \
        B(1)     C(2)
      /   \       \
     D(3)  E(4)    F(5)
    */
}

运行结果:

ABCDE F

五,二叉树的遍历方式

方式一,深度优先遍历

深度优先遍历是从第一个节点开始遍历二叉树并到达没有子节点的最深节点,在到达最深节点后,回退到它的父节点,然后递归地执行此操作,直到遍历所有节点。

二叉树的深度优先遍历,先将树分为三个部分即根节点、左子树和右子树,由此生成了三种遍历方式: 

方式1.前序遍历:

step.01:处理根节点。

step.02:移动到左子树并递归遍历。

step.03:移动到右子树并递归遍历。

遍历顺序:A → B → D → E → C → F → G

方式2.中序遍历:

step.01:移动到左子树并递归遍历。

step.02:处理根节点。

step.03:移动到右子树并递归遍历。

遍历顺序: D → B → E → A → F → C → G

方式3.后序遍历:

step.01:移动到左子树并递归遍历。

step.02:移动到右子树并递归遍历。

step.03:处理根节点。

遍历顺序:D → E → B → F → G → C → A

注意,在递归遍历的时候,里面"处理根节点"这一步,有可能是在处理子树的根节点,步骤中提到的根节点是一直随着子树变化的。

用C++代码表示它们的递归调用写法,注意cout打印语句在三个函数中的位置:

void preorder(Node *root)
{
       if(!root)
              return;
       cout<<root->data<<" ";
       preorder(root->left);
       preorder(root->right);
}

void inorder(Node *root)
{
       if(!root)
              return;
       inorder(root->left);
       cout<<root->data<<" ";
       inorder(root->right);
}

void postorder(Node *root)
{
       if(!root)
              return;
       postorder(root->left);
       postorder(root->right);
       cout<<root->data<<" ";
}

方式二,广度优先遍历

和图结构的操作方式类似,遍历从根节点开始,逐层进行遍历,每层从左到右对子节点进行遍历。

四种二叉树遍历方式的代码实现

场景: 

前序遍历结果:1 2 4 5 3 6

中序遍历结果:4 2 5 1 3 6

后序遍历结果:4 5 2 6 3 1

广度优先遍历结果:1 2 3 4 5 6

Python实现:

class Node:
    def __init__(self, data):
        self.left = None
        self.right = None
        self.data = data

    def preorder(self, root):
        res = []
        if root:
            res.append(root.data)
            res = res + self.preorder(root.left)
            res = res + self.preorder(root.right)
        return res

    def inorder(self, root):
        res = []
        if root:
            res = self.inorder(root.left)
            res.append(root.data)
            res = res + self.inorder(root.right)
        return res

    def postorder(self, root):
        res = []
        if root:
            res = self.postorder(root.left)
            res = res + self.postorder(root.right)
            res.append(root.data)
        return res

    def level_order(self, root):
        res = []
        if root:
            queue = [root]
            while queue:
                currentNode = queue.pop(0)
                res.append(currentNode.data)
                if currentNode.left:
                    queue.append(currentNode.left)
                if currentNode.right:
                    queue.append(currentNode.right)
        return res

if __name__ == '__main__':
    root = Node(1)
    root.left = Node(2)
    root.right = Node(3)
    root.left.left = Node(4)
    root.left.right = Node(5)
    root.right.right = Node(6)

    print("前序遍历结果: ")
    print(root.preorder(root))
    print("中序遍历结果: ")
    print(root.inorder(root))
    print("后序遍历结果: ")
    print(root.postorder(root))
    print("广度优先遍历结果: ")
    print(root.level_order(root))

运行结果:

前序遍历结果:
[1, 2, 4, 5, 3, 6]
中序遍历结果:
[4, 2, 5, 1, 3, 6]
后序遍历结果:
[4, 5, 2, 6, 3, 1]
广度优先遍历结果:
[1, 2, 3, 4, 5, 6]

C++实现:

#include<iostream>
#include<queue>
using namespace std;
struct Node
{
    int data;
    Node* left;
    Node* right;
};
Node* getNewNode(int data)
{
    Node* temp = new Node;
    temp->data = data;
    temp->left = NULL;
    temp->right = NULL;
    return temp;
}
void preorder(Node* root)
{
    if (!root)
        return;
    cout << root->data << " ";
    preorder(root->left);
    preorder(root->right);
}
void inorder(Node* root)
{
    if (!root)
        return;
    inorder(root->left);
    cout << root->data << " ";
    inorder(root->right);
}
void postorder(Node* root)
{
    if (!root)
        return;
    postorder(root->left);
    postorder(root->right);
    cout << root->data << " ";
}
void level_order(Node* root)
{
    if (!root)
        return;
    queue<Node*> q;
    q.push(root);
    while (!q.empty())
    {
        Node* temp = q.front();
        q.pop();
        cout << temp->data << " ";
        if (temp->left != NULL)
            q.push(temp->left);
        if (temp->right != NULL)
            q.push(temp->right);
    }
}
int main()
{
    Node* root = getNewNode(1);
    root->left = getNewNode(2);
    root->right = getNewNode(3);
    root->left->left = getNewNode(4);
    root->left->right = getNewNode(5);
    root->right->right = getNewNode(6);
    cout << "\n前序遍历结果: " << endl;
    preorder(root);
    cout << "\n中序遍历结果: " << endl;
    inorder(root);
    cout << "\n后序遍历结果: " << endl;
    postorder(root);
    cout << "\n广度优先遍历结果: " << endl;
    level_order(root);
    return 0;
}

运行结果:

前序遍历结果:
1 2 4 5 3 6
中序遍历结果:
4 2 5 1 3 6
后序遍历结果:
4 5 2 6 3 1
广度优先遍历结果:
1 2 3 4 5 6

六,参考阅读

《Problem Solving with Algorithms and Data Structures Using Python, Second Edition》

https://www.softwaretestinghelp.com/binary-tree-in-cpp/

https://www.geeksforgeeks.org/introduction-to-binary-tree-data-structure-and-algorithm-tutorials/

https://avidpython.com/algorithms/binary-tree-traversal-algorithms-in-cpp/

https://www.enjoyalgorithms.com/blog/introduction-to-binary-tree

https://www.tutorialspoint.com/data_structures_algorithms/tree_traversal.htm

数据结构与算法(Python)——常见数据结构Part4(二叉树) 写在前面 在上一节part3我们熟悉队列结构,本节将熟悉应用广泛的树结构。我们的目的是快速了解他们,对于它们涉及到的复杂的数据结构和算法,在这里并不全部展开,留在后期详述。 1. 树 1.1 树的直观感受 树是一个广泛应用的数据结构,即使未开始学习这个数据结构,我们在生活或者计算机中已经和它打交道好久了。首先让我们看几个树形的应用例子(图片来自What is the real li... 阅读详情

相关推荐

Python高级数据结构——树(Tree)

在本文中,我们将深入讲解Python中的树,包括树的基本概念、表示方法、常见类型、遍历算法以及实际应用。二叉搜索树(Binary Search Tree,BST)是一种有序的二叉树,对于每个节点,其左子树的所有节点值都小于该节点值,右子树的所有节点值都大于该节点值。树的遍历是按照一定规则依次访问树的所有节点,主要有前序遍历、中序遍历和后序遍历。使用字典表示树的层次结构,每个节点的键是节点的数据,值是其子节点的字典。使用类表示树的节点,每个节点包含数据、左子节点和右子节点。树是由节点和边组成的层次结构。

Echo_Wish 4224

数据结构Python版--树

数据结构Python版--树

weixin_56368033的博客 3583

贝塞尔曲线基础

贝塞尔曲线于1962年由法国工程师皮埃尔·贝塞尔(Pierre Bézier)所广泛发表,他运用贝塞尔曲线来为汽车的主体进行设计。贝塞尔曲线最初由Paul de Casteljau于1959年运用de Casteljau演算法开发,以稳定数值的方法求出贝兹曲线。

YiYeZhiNian的博客 2045

Python数据结构与算法之树

树是一种非常重要的非线性结构,它在计算机领域的应用十分广泛,如在编译程序或数据库程序中。树形结构具有分支性(分支性是由于一个或多个或多个结点存在两个或两个以上直接后继节点)和层次性(层次性是由分支产生并呈现出来的)两大特点。

qq_63215420的博客 1786

MuJoCo 机械臂关节空间阻抗控制Impedance实现(附代码)

阻抗控制通过调整关节的刚度和阻尼,让机器人在接触时产生顺应性,减少冲击力,其核心目标是在接触外部载荷时能够自适应调整输出力矩,实现力与位置的协同控制。阻抗控制可以很快的到达设定位置,在此基础上,使用mujoco交互中的施加外力操作,可以看到当外力松开后,机械臂也可以很快的回弹回设定位置。其中self.Kp和self.Kd为固定刚度和阻尼系数,通过修改刚度和阻尼参数,可以变得更柔顺来应对各种场景。注释掉该行后,直接simulate仿真可以看到机械臂控制位置震荡等情况,接下来引入关节空间阻抗控制的代码。

darcsdn 1274

「分治法」最近点对距离问题

一、问题描述 给定平面S上n个点,找其中的一对点,使得在n个点组成的 所有点对中,该点对间的距离最小。 假设所讨论的点是以标准笛卡儿坐标形式(x, y)给出的。因 此,在两个点Pi =(xi , yi )和Pj =(xj , yj )之间的距离是标准的欧几里德 距离: d = 根号下( x i − x j ) 2 + ( y i − y j )2 二、问题分析 直接用暴力解法很简单,用结构体把每个点的x、y坐标都存下来之后,用一个二重循环即可获得距离的最大值。但是这样做的时间复杂度也达到了O(n的平方)

Laok0413的博客 9656

python数据结构-树

树 树是数据元素之间具有层次关系的非线性结构,由n个节点构成的有限集合,节点数为0的树叫空树 树: 有且仅有一个被称为根的节点 其余节点可分为m个互不相交的有限集合,每个集合又构成一棵树,叫做根节点的子树 树中的元素具有一对多的逻辑关系 除根节点以外,每个数据元素可以有多个后继但有且仅有一个前驱 树是递归定义的 节点的路径:根节点到该节点所经过节点的顺序排序 路径的长度:路径的长度指的是路径中包含的分支数 节点的度:节点的度指的是节点拥有的子树的数目 树的度:树的度指的是树中所有节点的度的最大值 叶节点

漫漫行程路 9675

爆改YOLOv8 | PSA注意力机制融合入YOLOv8

yolov8,PSA注意力,即插即用

weixin_43986124的博客 2497

数据结构小记【Python/C++版】——BST树篇

数据结构基础

程序员与背包客_CoderZ 1213

Ubuntu20.04安装Torque-6.1.2单机版(踩坑篇)

说明:PBS排队系统原先是在Centos7安装使用很顺利,但是有客户需求在Ubuntu20.04上使用,着手在Ubuntu20.04安装上安装的时候发现很多报错,并不能顺利安装,网上查找到的教程,有的说是让放弃转slurm,有的是换源安装,但是安装好的版本很低,有许多bug,不是很好用。经过自己慢慢摸索之后,改了部分配置以及源码之后,能够顺利安装,再次记录一下踩坑心得,与大家一起分享学习。如有问题,欢迎大家来撩。...............

华青水上的博客 8087

微信数据库读取解密脚本 聊天记录查看工具,支持所有微信版本,后期将支持企业微信[Windows]

(1)获取微信昵称、微信账号、微信手机号、微信邮箱、微信KEY的基址偏移(2)获取微信的微信昵称、微信账号、微信手机号、微信邮箱、微信KEY、微信原始ID(wxid_******)(3)获取微信文件夹路径(4)支持查看聊天记录查看(5)根据key解密微信数据库(6)提供数据库部分字段说明(7)支持微信多开场景,获取多用户信息等(8)微信需要登录状态才能获取数据库密钥(9)支持导出聊天记录为html,备份微信聊天记录,方便查看(10)合并多个数据库,方便查看。

weixin_43101935的博客 1万+

数据结构小记【Python/C++版】——AVL树篇

数据结构基础

程序员与背包客_CoderZ 1060

华为OD机试双机位C卷-部门人力分配 (Py/Java/C/C++/Js/Go)

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

qq_45776114的博客 1873

数据结构小记【Python/C++版】——B树篇

数据结构基础

程序员与背包客_CoderZ 771

微店构造订单页面,自动化抢票

之前的文章写过微店抢票如何构造订单页面分析,这篇文章在之前的基础上,进行抢票。

猫敷雪 7202

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

数据结构小记【Python/C++版】——堆结构篇

数据结构基础

程序员与背包客_CoderZ 928

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

头条面试小记

基础小面: 1.python中常用的数据结构有哪些? 2.列表和元组的区别?还有什么区别? 3.固件安全?啥是固件?固件是硬件吗?和软件有啥区别?你们搞这个用来做啥的? 我刚说固件是底层软件,她接上话是不是芯片,我说芯片里面也有,还有路由器、交换机、防火墙、打印机、手机、网络摄像头、工业机器人、PLC等,还没等我说一半,就打断了我。说她不懂。 4.mongodb和mysql区别和...

果冻先生的专栏 515

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

文章收录1

3.Hive Metastore 代码简析 4.受限的玻尔兹曼机 5.以公司实际应用讲解OpenStack到底是什么 6.Ubuntu12.04安装hadoop 7.vpsmate安装完再重启服务器,vpsmate不无再次打开的解决方法 8.如何使用JDBC快速处理大数据 9.关于集群技术的几个新工具的介绍 10.CHD4 impa...

ithome 1万+

Python数据结构与算法-树

Python数据结构与算法

little_limin的博客 2699

python数据结构——树

一、树的定义及相关概念 树的例子: 生物学的分类树、文件系统、网页 一个节点的所有子节点独立于另一个节点的子节点。 每个叶节点是唯一的。 树的概念 节点、边、根、路径、子节点、父节点、兄弟节点、子树 层数:节点 n 的层数为从根结点到该结点所经过的分支数目。 根节点的层数为零。 高度:树的高度等于树中任何节点的最大层数。 树的定义: 树由一组节点和一组连接节点的边组成。树具有以下属性: 树的一个节...

vivian_ll的博客 3088

Python 实现树结构

        树在计算机科学的许多领域中使用,包括操作系统,图形,数据库系统和计算机网络。树数据结构与他们的植物表亲有许多共同之处。树数据结构具有根,分支和叶。自然界中的树和计算机科学中的树之间的区别在于树数据结构的根在顶部,其叶在底部。 1 树的相关定义 节点:树的基本部分。它可以有一个名称,我们称之为“键”。节点也可以有附加信息。我们将这个附加信息称为“有效载荷”。虽然有效载荷信息不是...

U R MINE 8万+

数据结构与算法(python):树结构

参考自 MOOC数据结构与算法Python版 目录一、什么是树1.1 树结构相关术语1.2 树的定义二、树的嵌套列表实现 一、什么是树 树是一种基本的“非线性”数据结构。跟自然界中的树一样, 数据结构树也分为:根、 枝和叶等三个部分。一般数据结构的图示把根放在上方,叶放在下方。 分类树的三个特征: 分类体系是层次化的 一个节点的子节点与另一个节点的子节点相互之间是隔离、独立的 每一个叶节点都具有唯一性 1.1 树结构相关术语 术语 说明 根Root 树中唯一一个没有入边的节点 路径P

番茄大人的博客 4396

Python数据结构(树)

树(英语: tree)是一种抽象数据类型ADT) 或是实作这种抽象数据类型的数据结构,用来模拟具有树状结构性质的数据集合。它是由n(n>=1)个有限节点组成一个具有层次关系的集合。把它叫做“树”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。它具有以下的特点:每个节点有零个或多个子节点;没有父节点的节点称为根节点;每一个非根节点有且只有一个父节点;除了根节点外,每个子头点可以分为多个不相交的子树;

m0_54382779的博客 1344

【Python 数据结构 9.树】

树是n个结点的有限集合,n=0时为空树。当n大于0的时候,满足如下两个条件:① 有且仅有一个特定的结点,称为根结点 Root;② 当 n > 1 时,其余结点分为 m 个互不相交的有限集合,T1、T2、T3、….Tm,其中每个 Ti 又是一棵树,并且为 Root 的子树;树的定义用到了递归的思想。即树的定义中,还用到了树的概念。T1 和 T2 就是 a 的子树,结点 d、9、h、i 组成的树又是结点 b 的子树子树的个数没有限制,但是它们一定是互不相交的。

m0_73983707的博客 1711

python数据结构之树

☀️上一节我们学习了数据结构里面的各种排序算法,今天,我们接着学习数据结构中又一重要的结构:树,对往期内容感兴趣的小伙伴可以参考下面内容????: python数据类型: python数据结构之数据类型. python的输入输出: python数据结构之输入输出、控制和异常. python数据结构之面向对象: python数据结构之面向对象. python数据结构之算法分析: python数据结构之算法分析. python数据结构之栈、队列和双端队列: python数据结构之栈、队列和双端队列. pyth

柳小葱的博客 3822

python数据结构——基础树结构1(结构篇)

本文简要叙述了二叉树结构的实现

h20050621的博客 385
上一篇: 数据结构小记【Python/C++版】——散列表篇
下一篇: C++开发基础——移动语义和右值引用
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

程序员与背包客_CoderZ

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

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

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

打赏作者

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

抵扣说明:

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

余额充值