创作

完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>

3天内不再提示

如何使用 go 实现红黑树

Ltlc_LinuxHub 来源:Linux爱好者 作者:Linux爱好者 2022-03-21 11:54 次阅读

本文介绍了使用 go 实现红黑树。

二叉搜索树(二叉查找树)

二叉查找树也叫二叉搜索树,也叫二叉排序树,它具有以下特点:1. 如果左子树不为空,则左子树上的结点的值都小于根节点;2. 如果右子树不为空,则右子树上的结点的值都大于根节点;3. 子树同样也要遵循以上两点。

二叉树的遍历方式

二叉树的遍历方式:前序遍历、中序遍历、后序遍历和层序遍历(MySql)。

只要一棵树是二叉查找树,那么它的中序遍历(左根右输出)一定是有序的。比如看下边的一棵二叉树:

a132bac4-9330-11ec-952b-dac502259ad0.jpg

它的前序遍历(根左右)为:530468;
它的中序遍历(左根右)为:034568;
它的后序遍历(左右根)为:043865。

二叉搜索树有哪些应用?

既然是搜索树,那么它肯定就是用在查找上。我们来分析下它的查找时间复杂度:

先来看下面两颗二叉搜索树:

a143adac-9330-11ec-952b-dac502259ad0.jpg

查找时间复杂度其实就是树的深度。

上图一的时间复杂度:O(n)时间复杂度,表示需要查找 n 次,即循环 n 遍,退化成链表的情况。

上图二的时间复杂度(类似二分查找):logn,即 => x= => logn。

那么为什么会出现退化成链表的情况(图一)呢?我们该怎么处理才不会变成链表呢(怎么解决)?

当插入的节点数值从小到大时,则就会出现二叉树退化成链表的情况,那么有另一种树可以解决这种情况,就是平衡二叉树(AVL树)。

AVL树是一种追求极致平衡的二叉搜索树,即将树调整到最优的情况,由于这种树结构比较苛刻、旋转也比较多,这里就不重点展开讲。

红黑树

红黑树的由来

今天需要重点讲的是红黑树。红黑树的底层数据结构其实就是二叉查找树,也就是说红黑树是一颗特殊的二叉查找树,也叫自平衡二叉查找树

红黑树出现的目的就是上所讲到的,为了解决二叉树退化成链表的情况。

红黑树的演进过程

链表(暴力查处) -> 二叉树 -> 二叉查找树 -> 特殊的二叉查找树(自平衡的二叉查找树)

红黑色讲解

通过上面的例子以及两个图,我们发现二叉树的结构就决定了其搜索的效率及性能,那么我们需要怎么样才让二叉树达到优化的效果呢?

因此就有了红黑树了,我们看下图(红黑树):

a15f25c8-9330-11ec-952b-dac502259ad0.jpg

红黑树的性质:

每个节点不是红色就是黑色(这里不一定要红色和黑色,只要知道这里的红色和黑色是什么意思即可)

一定没有连在一起的红色节点

根节点(第一个节点)是黑色 root

每个红色节点的两个字节点都是黑色

叶子结点都是黑色(上图中其实还有为null的叶子结点没有画出来),如下图所示:

a1753dae-9330-11ec-952b-dac502259ad0.jpg

根据以上性质或者说满足了以上性质的树,就可以达到近似平衡了。

怎么判断一个节点是否为根结点?

没有父节点

入度为0的节点

红黑树变换规则

要满足这些性质,需要对树做什么操作呢?

为了红黑可以满足这些性质,因此出现了旋转,那么红黑树有几种变换规则呢?

有三种变换规则:

变色:红变黑 黑变红

左旋转

右旋转

左旋转示例:

a1892648-9330-11ec-952b-dac502259ad0.jpg

旋转和颜色变换规则:所有插入的点默认为红色; 1. 变颜色的情况:如果插入的节点的父节点和叔叔节点为红色,则:1)把父节点和叔叔节点设为黑色;2)把爷爷(祖父)节点设为红色;3)把指针定位到爷爷节点作为当前需要操作的节点,再根据变换规则来进行判断操作。2. 左旋:如果当前父节点是红色,叔叔节点是黑色,而且当前的节点是右子树时,则需要以父节点作为左旋转。3. 右旋:当前父节点是红色,叔叔节点是黑色,且当前的节点是左子树时,则:1)把父节点变为黑色;2)把爷爷节点变为红色;3)以父节点右旋转。

a19a2f92-9330-11ec-952b-dac502259ad0.jpg

比如要往上图中插入数字6,则这颗红黑色的演变过程如下:

step1: 插入6节点后如下图,它的父节点和叔叔节点均是红色,则需要根据变换规则来操作,到step2了。

a1a952c4-9330-11ec-952b-dac502259ad0.jpg

step2: 根据变换规则,需要将插入节点的父节点和叔叔节点均变为黑色,爷爷节点变为红色,然后将指针定位到爷爷节点(蓝色圈)。将指针定位到爷爷节点(12)后,此时做为当前需要操作的节点,再根据变换规则来判断,可以看到下图的当前节点(12)的叔叔节点是黑色的,则不能用变颜色规则的情况了,进行step3,此时需要进行左旋或右旋了。

a1b9a8fe-9330-11ec-952b-dac502259ad0.jpg

step3: 根据上图情况可以知道此时是符合左旋规则的:当前节点(12)的父节点(5)是红色,叔叔节点(3)是黑色,而且当前的节点是右子树。接下来需要进行左旋变换(三步走):

a1cd5ade-9330-11ec-952b-dac502259ad0.jpg

step4:左旋变换后,可以看到当前节点(5)的父节点(12)为红色,叔叔节点(30)为黑色,而且当前节点为左子树,符合右旋的规则。接下来就是进行右旋的变换操作了:1)把父节点(12)变为黑色;2)把爷爷节点(29)变为红色;3)以父节点(12)右旋转

a1dc228a-9330-11ec-952b-dac502259ad0.jpg

小结

到这里,可以看到经过多次旋转后,这棵树是符合红黑色的性质。

Golang代码实现红黑树

直接上代码,如下:

packagemain

import(
"fmt"
"math/rand"
"time"
)

const(
REDbool=true
BLACKbool=false
)

typeNodestruct{
keyint
valueinterface{}

left*Node
right*Node
//parent*Node

colorbool
}

typeRedBlackTreestruct{
sizeint
root*Node
}

funcNewNode(key,valint)*Node{
//默认添加红节点
return&Node{
key:key,
value:val,
left:nil,
right:nil,
//parent:nil,
color:RED,
}
}

funcNewRedBlackTree()*RedBlackTree{
return&RedBlackTree{}
}

func(n*Node)IsRed()bool{
ifn==nil{
returnBLACK
}
returnn.color
}

func(tree*RedBlackTree)GetTreeSize()int{
returntree.size
}

//nodex
///左旋转/
//T1x--------->nodeT3
////
//T2T3T1T2
func(n*Node)leftRotate()*Node{
//左旋转
retNode:=n.right
n.right=retNode.left

retNode.left=n
retNode.color=n.color
n.color=RED

returnretNode
}

//nodex
///右旋转/
//xT2------->ynode
////
//yT1T1T2
func(n*Node)rightRotate()*Node{
//右旋转
retNode:=n.left
n.left=retNode.right

retNode.right=n
retNode.color=n.color
n.color=RED

returnretNode
}

//颜色变换
func(n*Node)flipColors(){
n.color=RED
n.left.color=BLACK
n.right.color=BLACK
}

//维护红黑树
func(n*Node)updateRedBlackTree(isAddint)*Node{
//isAdd=0说明没有新节点,无需维护
ifisAdd==0{
returnn
}

//需要维护
ifn.right.IsRed()==RED&&n.left.IsRed()!=RED{
n=n.leftRotate()
}

//判断是否为情形3,是需要右旋转
ifn.left.IsRed()==RED&&n.left.left.IsRed()==RED{
n=n.rightRotate()
}

//判断是否为情形4,是需要颜色翻转
ifn.left.IsRed()==RED&&n.right.IsRed()==RED{
n.flipColors()
}

returnn
}

//递归写法:向树的root节点中插入key,val
//返回1,代表加了节点
//返回0,代表没有添加新节点,只更新key对应的value值
func(n*Node)add(key,valint)(int,*Node){
ifn==nil{//默认插入红色节点
return1,NewNode(key,val)
}

isAdd:=0
ifkey< n.key {
        isAdd, n.left = n.left.add(key, val)
    } else if key >n.key{
isAdd,n.right=n.right.add(key,val)
}else{
//对value值更新,节点数量不增加,isAdd=0
n.value=val
}

//维护红黑树
n=n.updateRedBlackTree(isAdd)

returnisAdd,n
}

func(tree*RedBlackTree)Add(key,valint){
isAdd,nd:=tree.root.add(key,val)
tree.size+=isAdd
tree.root=nd
tree.root.color=BLACK//根节点为黑色节点
}

//前序遍历打印出key,val,color
func(tree*RedBlackTree)PrintPreOrder(){
resp:=make([][]interface{},0)
tree.root.printPreOrder(&resp)
fmt.Println(resp)
}

func(n*Node)printPreOrder(resp*[][]interface{}){
ifn==nil{
return
}
*resp=append(*resp,[]interface{}{n.key,n.value,n.color})
n.left.printPreOrder(resp)
n.right.printPreOrder(resp)
}


//测试红黑树代码
funcmain(){
count:=10
redBlackTree:=NewRedBlackTree()
nums:=make([]int,0)
fori:=0;i< count; i++ {
        nums = append(nums, rand.Intn(count))
    }

    fmt.Println("source data: ", nums)
    now := time.Now()
    for _, v := range nums {
        redBlackTree.Add(v, v)
    }

    fmt.Println("redBlackTree:", now.Sub(time.Now()))
    redBlackTree.PrintPreOrder()
    fmt.Println("节点数量:", redBlackTree.GetTreeSize())
}

测试输出结果如下:

datasource:[1779185060]
redBlackTree:-2.136µs
[[77false][11true][00false][66false][55true][99false][88true]]
节点数量:7

总结

红黑树是保持近似平衡的二叉树,从另一种角度上来说红黑树不是平衡二叉树,它的最大高度为2*logn。

二分搜索树,AVL树,红黑树对比:1. 对于完全随机的数据源,普通二分搜索树很好用,缺陷是在极端情况下容易退化成链表 2. 对于查询较多的使用情况,AVL树很好用,因为他的高度一直保持h=logn 3. 红黑树牺牲了平衡性,即h=2*logn,但在添加和删除操作中,红黑树比AVL树有优势 4. 综合增删改查所有操作,红黑树的统计性能更优

原文标题:二叉树、红黑树以及Golang实现红黑树

文章出处:【微信公众号:Linux爱好者】欢迎添加关注!文章转载请注明出处。

审核编辑:彭菁

  • 代码
    +关注

    关注

    20

    文章

    2318

    浏览量

    60471
  • 数据源
    +关注

    关注

    1

    文章

    27

    浏览量

    8973
  • 二叉树
    +关注

    关注

    0

    文章

    43

    浏览量

    11078
收藏 人收藏

    评论

    相关推荐

    分享几个单片机的编程实例

    分享几个简单的单片机编程案例,比较基础的代码,容易看懂,还有注释,有需要的可以下载。 ...
    发表于 07-01 17:24 1401次 阅读

    Golang事件总线机制的实现

    最近在学习开源项目Grafana的代码,发现作者实现了一个事件总线的机制,在项目里面大量应用,效果也....
    的头像 Linux爱好者 发表于 07-01 16:02 80次 阅读

    Solid Sands SuperGuard C库安全认证套件

      总体而言,SuperGuard 测试套件允许开发人员将其软件映射到安全关键系统的要求,从而简化了....
    的头像 星星科技指导员 发表于 07-01 14:41 32次 阅读
    Solid Sands SuperGuard C库安全认证套件

    使用IDEA编写项目代码的实用小技巧

    当我们需要在当前开发的项目上下文之外,创建记录一些临时注释或者代码等,可以使用Scratch fil....
    的头像 Android编程精选 发表于 07-01 14:32 47次 阅读

    Java代码编写技巧

    自从毕业后,今年已经是我工作的第 8 个年头了,我甚至都快忘记了到底是哪年毕业的。
    的头像 Android编程精选 发表于 07-01 12:47 22次 阅读

    死锁的处理策略有哪些

    以此类推,共五次循环检查即可将5个进程都加入安全序列中,最终可得一个安全序列。该算法称为安全性算法。
    的头像 一口Linux 发表于 07-01 10:19 161次 阅读

    AD9361芯片进行数据接口逻辑代码的编写

    本文通过以高速AD9361芯片为例进行数据接口逻辑代码的编写,利用SelectIO IP快速高效完成....
    的头像 FPGA之家 发表于 07-01 09:59 131次 阅读

    利用axi_master接口指令端的几个静态参数的优化技巧

    本文给大家提供利用axi_master接口指令端的几个静态参数的优化技巧,从扩展总线接口数量,扩展总....
    的头像 OpenFPGA 发表于 07-01 09:39 47次 阅读

    PHP_CodeSniffer PHP代码审查

    ./oschina_soft/PHP_CodeSniffer.zip
    发表于 06-30 10:37 6次 阅读
    PHP_CodeSniffer PHP代码审查

    code6 GitHub代码泄露监控系统

    ./oschina_soft/code6.zip
    发表于 06-30 10:13 10次 阅读
    code6 GitHub代码泄露监控系统

    Dcat Admin高颜值的后台极速构建工具

    ./oschina_soft/gitee-dcat-admin.zip
    发表于 06-30 09:57 6次 阅读
    Dcat Admin高颜值的后台极速构建工具

    如何在IP的kernel module里设置并使用IP interrupt

    用附件里的 system-user.dtsi 把 project-spec/meta-user/re....
    的头像 FPGA之家 发表于 06-30 09:48 43次 阅读

    DirCMS内容管理系统

    ./oschina_soft/gitee-dircms6.zip
    发表于 06-30 09:37 6次 阅读
    DirCMS内容管理系统

    MISRA C可用于提高软件质量考虑

      通过定义 C 语言的可预测子集并为开发人员提供指导,MISRA C 为嵌入式控制系统和独立软件的....
    发表于 06-30 09:27 82次 阅读

    MASS竞猜幸运哈希游戏系统开发中冲突的解决方法

    3.2 链地址法 链地址法就是将相应位置上冲突的所有关键词存储在同一个单链表中。 设关键字序列为 4....
    的头像 開發丨KFZ433 发表于 06-29 16:51 178次 阅读
    MASS竞猜幸运哈希游戏系统开发中冲突的解决方法

    软件测试自身的完整性

      代码永远不应陷入无限循环,但逻辑错误或未发生预期的外部事件可能会导致代码挂起。当代码在等待某事发....
    的头像 星星科技指导员 发表于 06-29 15:43 109次 阅读

    使用测试自动化左移您的安全关键软件测试

      在某些软件安全标准中,例如 DO-178B 和 DO-178C,认证是在系统级别完成的,个别工具....
    的头像 星星科技指导员 发表于 06-29 14:25 94次 阅读
    使用测试自动化左移您的安全关键软件测试

    第三届无代码探索者大会将于7月6日盛大开幕

    第三届无代码探索者大会将于7月6日盛大开幕,该大会是轻流举办的年度产品发布会,将揭晓轻流的最新产品功....
    的头像 科技数码 发表于 06-29 11:38 67次 阅读
    第三届无代码探索者大会将于7月6日盛大开幕

    万岳在线教育系统WEB版

    ./oschina_soft/gitee-wanyue_education_web.zip
    发表于 06-29 09:58 8次 阅读
    万岳在线教育系统WEB版

    DuckPhp PHP框架

    ./oschina_soft/gitee-duckphp.zip
    发表于 06-29 09:43 6次 阅读
    DuckPhp PHP框架

    可重用库和子系统的高级静态分析

      随着静态分析工具的使用成为软件开发过程中不可或缺的一部分,这些工具的功能可以决定获得的整体价值。....
    的头像 星星科技指导员 发表于 06-29 09:34 60次 阅读
    可重用库和子系统的高级静态分析

    yangu-app-mall电商小程序商城

    ./oschina_soft/gitee-yangu-app-mall.zip
    发表于 06-29 09:31 10次 阅读
    yangu-app-mall电商小程序商城

    以厘cms PHP极简框架

    ./oschina_soft/gitee-cms.zip
    发表于 06-29 09:20 14次 阅读
    以厘cms PHP极简框架

    安全关键软件的非侵入式代码覆盖

      高效的目标虚拟化,再加上一个从执行跟踪数据中推断出精确的源级覆盖率指标的工具,用于非仪器化/未修....
    的头像 星星科技指导员 发表于 06-28 15:50 111次 阅读
    安全关键软件的非侵入式代码覆盖

    INSOperationsKit Advanced NSOperations会议代码样本

    ./oschina_soft/INSOperationsKit.zip
    发表于 06-28 14:32 8次 阅读
    INSOperationsKit Advanced NSOperations会议代码样本

    模型驱动测试如何生成基于代码的测试结果

      寻找方法帮助分布式团队更好地协同工作,同时推动高质量的可交付成果是许多组织的首要任务。当开发过程....
    的头像 星星科技指导员 发表于 06-28 14:12 117次 阅读
    模型驱动测试如何生成基于代码的测试结果

    LXFPhotoHelper调用系统相机与相册

    ./oschina_soft/LXFPhotoHelper.zip
    发表于 06-28 11:49 6次 阅读
    LXFPhotoHelper调用系统相机与相册

    开源软件-CodeFever Git代码托管服务

    ./oschina_soft/codefever.zip
    发表于 06-28 11:35 6次 阅读
    开源软件-CodeFever Git代码托管服务

    「Spring」认证安全架构指南

    本指南是 Spring Security 的入门指南,提供对框架设计和基本构建块的深入了解。我们仅涵....
    的头像 「Spring」认证安全架构 发表于 06-27 14:37 51次 阅读

    OAuthSwiftFutures为OAuthSwift增加了futures/promises

    ./oschina_soft/OAuthSwiftFutures.zip
    发表于 06-27 11:33 8次 阅读
    OAuthSwiftFutures为OAuthSwift增加了futures/promises

    CYLTableViewPlaceHolder占位视图管理

    ./oschina_soft/CYLTableViewPlaceHolder.zip
    发表于 06-27 11:27 8次 阅读
    CYLTableViewPlaceHolder占位视图管理

    A-VibrancyView iOS模糊和镂空透明层

    ./oschina_soft/A-VibrancyView.zip
    发表于 06-27 09:57 8次 阅读
    A-VibrancyView iOS模糊和镂空透明层

    XZMCoreNewFeature版本新特性框架

    ./oschina_soft/XZMCoreNewFeature.zip
    发表于 06-27 09:42 6次 阅读
    XZMCoreNewFeature版本新特性框架

    怎么开发启动框架plugin

    在移动端中启动 Flutter 页面会有短暂空白,虽然官方提供了引擎预热机制,但是需要提前将所有页面....
    的头像 谷歌开发者 发表于 06-24 16:28 320次 阅读

    FFToast iOS消息提醒控件

    ./oschina_soft/FFToast.zip
    发表于 06-24 11:06 10次 阅读
    FFToast iOS消息提醒控件

    GXWaterCollectionViewLayout可设置纵横方向和排列数的瀑布流布局

    ./oschina_soft/GXWaterCollectionViewLayout.zip
    发表于 06-24 10:56 9次 阅读
    GXWaterCollectionViewLayout可设置纵横方向和排列数的瀑布流布局

    Valet钥匙链中存储数据的iOS库

    ./oschina_soft/Valet.zip
    发表于 06-24 10:21 13次 阅读
    Valet钥匙链中存储数据的iOS库

    FXDanmaku高性能弹幕库

    ./oschina_soft/FXDanmaku.zip
    发表于 06-24 10:17 11次 阅读
    FXDanmaku高性能弹幕库

    HDAlertView类似iOS alertView弹窗组件

    ./oschina_soft/HDAlertView.zip
    发表于 06-24 10:15 9次 阅读
    HDAlertView类似iOS alertView弹窗组件

    TeamTalk4Mac中小型企业内部通讯IM

    ./oschina_soft/teamtalk.zip
    发表于 06-24 09:49 11次 阅读
    TeamTalk4Mac中小型企业内部通讯IM

    CLWheelMenuView Swift转盘菜单

    ./oschina_soft/CLDemo.zip
    发表于 06-23 11:00 11次 阅读
    CLWheelMenuView Swift转盘菜单

    eventpp C++事件派发和回调代码库

    ./oschina_soft/eventpp.zip
    发表于 06-23 10:38 6次 阅读
    eventpp C++事件派发和回调代码库

    libaco轻量级C非对称协程库

    ./oschina_soft/libaco.zip
    发表于 06-23 10:11 12次 阅读
    libaco轻量级C非对称协程库

    安富莱C语言编码规范

    以下提供两种命名方式以供参考:(1)各程序模块的文件命名开头 2 个小写字母代表本模块的功能:如:主....
    的头像 硬件攻城狮 发表于 06-22 14:38 151次 阅读

    MazuCC微型C编译器

    ./oschina_soft/MazuCC.zip
    发表于 06-22 11:36 12次 阅读
    MazuCC微型C编译器

    CIDLib C++开发平台

    ./oschina_soft/CIDLib.zip
    发表于 06-22 11:26 11次 阅读
    CIDLib C++开发平台

    SPSCQueue单一消费者等待和无锁定大小队列

    ./oschina_soft/SPSCQueue.zip
    发表于 06-22 10:24 6次 阅读
    SPSCQueue单一消费者等待和无锁定大小队列

    你应该知道的18个PyTorch小技巧

    我首先提供一个完整的列表和一些代码片段,这样你就可以开始优化你的脚本了。然后我一个一个地详细地研究它....
    的头像 OpenCV学堂 发表于 06-22 10:00 251次 阅读

    Python模块Addict的安装与使用

    Addit 是一个Python模块,除了提供标准的字典语法外,Addit 生成的字典的值既可以使用属....
    的头像 python爬虫知识分享 发表于 06-21 16:14 235次 阅读

    OpenHarmony原子化服务开发快速入门体验(中)

    四、编写项目代码 1.新新建一个文件夹common-images将部分照片放在images目录下,作....
    的头像 鸿蒙时代 发表于 06-21 11:11 200次 阅读
    OpenHarmony原子化服务开发快速入门体验(中)

    OpenHarmony原子化服务开发快速入门体验(上)

    目录: 一、体验说明 二、搭建开发环境 三、创建openHarmony新工程 四、编写项目代码 五、....
    的头像 鸿蒙时代 发表于 06-21 11:07 271次 阅读
    OpenHarmony原子化服务开发快速入门体验(上)

    求助,打开DevEco Studio看代码的时候注释中文全变成乱码的原因是什么?

    不知道为什么,今天打开DevEcoStudio,看代码的时候,注释中文全变成乱码了,求助!! ...
    发表于 06-10 10:29 386次 阅读

    【飞控开发高级篇2】疯壳·开源编队无人机-遥控整机代码走读、编译与烧写

    COCOFLY教程——疯壳无人机·系列遥控整机代码走读、编译与烧写 图1 一、代码架构  遥控的整体代码工程...
    发表于 06-08 16:00 949次 阅读
    【飞控开发高级篇2】疯壳·开源编队无人机-遥控整机代码走读、编译与烧写

    【飞控开发高级篇】疯壳·开源编队无人机-飞控整机代码走读、编译与烧写

    COCOFLY教程——疯壳·无人机系列飞控整机代码走读、编译与烧写 图1 一、代码架构  飞控的整体代码工程由...
    发表于 06-07 18:16 4399次 阅读
    【飞控开发高级篇】疯壳·开源编队无人机-飞控整机代码走读、编译与烧写

    CH569的HSPI代码测试的速度很慢如何处理?

    看手册写的最高速度达到3.8Gbps,有测试Demo吗。 用HSPI_BurstMode代码测试的感觉速度也就300MByte/s+,不知道是哪出...
    发表于 06-01 06:10 102次 阅读

    求助大神,rt_ringbuffer_peak疑问求解

    rt_size_t rt_ringbuffer_peak(struct rt_ringbuffer *rb, rt_uint8_t **ptr) {     RT_ASSERT(rb != RT_...
    发表于 05-27 11:30 2096次 阅读

    请问CH32V103的引导代码是可以修改的吗?

    这是否意味着我可以把出货的产品引导代码的烧录和调试功能给彻底去掉,从而避免芯片被利用引导程序BUG破解.提高安全性. &...
    发表于 05-18 06:23 192次 阅读

    【开发教程9】人形街舞机器人-整机代码

    整机代码            1相关简介        本章将结合前面实验章节,完成机器人...
    发表于 05-17 16:40 4222次 阅读
    【开发教程9】人形街舞机器人-整机代码

    小白福利!教你用低代码实现一个简单的页面跳转功能

    一、介绍 HUAWEI DevEco Studio(后文简称:IDE)自2020年9月首次发布以来,经10次迭代升级,不断为HarmonyOS...
    发表于 05-16 17:22 6029次 阅读

    OpenHarmony仓库大整理 可以指定系统类型下载对应代码

    前言: 以前下载OpenHarmony代码的时候,我们都是需要下载全量包,代码量非常大,现在已经有30多G了。 而我们如果只是想开发...
    发表于 05-12 15:44 564次 阅读