重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
删除节点后,取其左子树的最大元素填充该节点,留下的空缺由它的下层元素填充。
创新互联专业为企业提供光山网站建设、光山做网站、光山网站设计、光山网站制作等企业网站建设、网页设计与制作、光山企业网站模板建站服务,10多年光山做网站经验,不只是建网站,更提供有价值的思路和整体网络服务。
如果无左子树,则直接用右孩子填充。
删30:
60
/
\
20
80
\
\
40
90
/
/
35
85
/
\
32
88
删80:
60
/
\
30
90
/
\
/
20
40
85
/
\
35
88
/
32
删60:
40
/
\
30
80
/
\
\
20
35
90
/
/
32
85
\
88
实现上述二叉搜索树删除操作的函数为:
bstree
delete(
elementtype
x,bstree
t)
{
position
tmpcell;
if(t==null)
error("要删除的元素x未找到");
else
if(xt-element)
/*go
left
*/
t-left=delete(x,t-left);/*
在左子树递归删除*/
else
if(xt-element)
/*go
right
*/
t-right=delete(x,t-right);/*
在右子树递归删除*/
else
/*找到要删除的节点*/
if(t-left!=null)
/*删除节点有左子树*/
{
/*在左子树中找最小的元素填充删除节点*/
tmpcell=findmax(t-left);
t-element=tmpcell-element;
t-left=delete(t-element,t-left);/*在删除节点的左子树中删除最大元素*/
}
else
/*删除节点无左子树*/
{
t=t-left;
free(tmpcell);
}
return
t;
}
这选择显然是因人而异的。。至于怎么选,要看你是初学者,还是老手?。。对性能有要求,还是没要求?
如果是完全没有基础,我建议哪个都不选,如果非要选一个,那就选PYTHON。。如果你是初学者,把网上的教程看个遍,再买上几本书。。。你所学会的也仅仅是语法,而根本不会编程。。。因为这些教程,也仅仅是教你语法,而没有教你编程。。你甚至把网上的教程看个精光,却连个最基本的OA系统都做不出来。。。只能在一个黑乎乎的控制台上,打印一堆破字符。。
-------网上的所有教程都会教你的:
怎么定义一个变量?怎么在控制台打印变量?
怎么写一个循环?怎么在控制台打印一堆变量?
怎么写一个函数?怎么在控制台打印返回值?
怎么创建一个对象?怎么在控制台打印对象属性?
------高级一点的教程,会教你的:
怎么用PYTHON的模块,写一个爬虫?
怎么用RUBY的ROR框架,获取一个表单?
怎么用GO的beego,写一个博客?
-------而这些的教程,从来不教你的:
面向对象有什么用? 委托是什么?事件是什么? 工厂模式,单例模式,观察者模式,这些都是啥?套接字是啥?UDP是啥?TCP/IP是啥?二叉树是什么玩意?状态机又是什么玩意?啥叫逆变?啥叫协变?啥叫异步?啥叫反射?
---------------------------------------------------------------------------------------------
如果一套教程,要把这些都讲明白。。。可能需要上千集。。。所以这些教程,都跳过了这些内容。。但如果你不明白这些,就根本学不会编程。。。如果你打算学一门语言,而手上只有几十集教程,外加三五本书。。。那你只能学会玩控制台。。。
所以初学者选择一门语言,首先要保证这门语言作为主要开发语言,常年被公司使用,这样才能真正学会编程。然而这三门语言都不具备这样的特点。它们通常都是被当成第二语言,做一些辅助开发的工作。其中Python只在极少数情况下,才被用来作为主要开发语言。至于Go与Ruby,我目前还没听说过它们有被当作主要开发语言的例子。我所推荐的是从C#和JAVA两者之间,二选一。。。学精其中一门之后,再来考虑PYTHON或GO作为第二语言。。。不然无论你选哪个,都几乎不可能靠一门语言找到工作。
Go语言作为出现比较晚的一门编程语言,在其原生支持高并发、云原生等领域的优秀表现,像目前比较流行的容器编排技术Kubernetes、容器技术Docker都是用Go语言写的,像Java等其他面向对象的语言,虽然也能做云原生相关的开发,但是支持的程度远没有Go语言高,凭借其语言特性和简单的编程方式,弥补了其他编程语言一定程度上的不足,一度成为一个热门的编程语言。
最近在学习Go语言,我之前使用过C#、Java等面向对象编程的语言,发现其中有很多的编程方式和其他语言有区别的地方,好记性不如烂笔头,总结一下,和其他语言做个对比。这里只总结差异的地方,具体的语法不做详细的介绍。
种一棵树最好的时间是十年前,其次是现在。
3)变量初始化时候可以和其他语言一样直接在变量后面加等号,等号后面为要初始化的值,也可以使用变量名:=变量值的简单方式
3)变量赋值 Go语言的变量赋值和多数语言一致,但是Go语言提供了多重赋值的功能,比如下面这个交换i、j变量的语句:
在不支持多重赋值的语言中,交换两个变量的值需要引入一个中间变量:
4)匿名变量
在使用其他语言时,有时候要获取一个值,却因为该函数返回多个值而不得不定义很多没有的变量,Go语言可以借助多重返回值和匿名变量来避免这种写法,使代码看起来更优雅。
假如GetName()函数返回3个值,分别是firstName,lastName和nickName
若指向获得nickName,则函数调用可以这样写
这种写法可以让代码更清晰,从而大幅降低沟通的复杂度和维护的难度。
1)基本常量
常量使用关键字const 定义,可以限定常量类型,但不是必须的,如果没有定义常量的类型,是无类型常量
2)预定义常量
Go语言预定义了这些常量 true、false和iota
iota比较特殊,可以被任务是一个可被编译器修改的常量,在每个const关键字出现时被重置为0,然后在下一个const出现之前每出现一个iota,其所代表的数字会自动加1.
3)枚举
1)int 和int32在Go语言中被认为是两种不同类型的类型
2)Go语言定义了两个浮点型float32和float64,其中前者等价于C语言的float类型,后者等价于C语言的double类型
3)go语言支持复数类型
复数实际上是由两个实数(在计算机中使用浮点数表示)构成,一个表示实部(real)、一个表示虚部(imag)。也就是数学上的那个复数
复数的表示
实部与虚部
对于一个复数z=complex(x,y),就可以通过Go语言内置函数real(z)获得该复数的实部,也就是x,通过imag(z)获得该复数的虚部,也就是y
4)数组(值类型,长度在定义后无法再次修改,每次传递都将产生一个副本。)
5)数组切片(slice)
数组切片(slice)弥补了数组的不足,其数据结构可以抽象为以下三个变量:
6)Map 在go语言中Map不需要引入任何库,使用很方便
Go循环语句只支持for关键字,不支持while和do-while
goto语句的语义非常简单,就是跳转到本函数内的某个标签
今天就介绍到这里,以后我会在总结Go语言在其他方面比如并发编程、面向对象、网络编程等方面的不同及使用方法。希望对大家有所帮助。
当客户端在 发出POST请求时/albums,您希望将请求正文中描述的专辑添加到现有专辑数据中。
为此,您将编写以下内容:
1、编写代码
a.添加代码以将专辑数据添加到专辑列表。
在此代码中:
1)用于Context.BindJSON 将请求正文绑定到newAlbum。
2) album将从 JSON 初始化的结构附加到albums 切片。
3)向响应添加201状态代码,以及表示您添加的专辑的 JSON。
b.更改您的main函数,使其包含该router.POST函数,如下所示。
在此代码中:
1)将路径中的POST方法与 /albumspostAlbums函数相关联。
使用 Gin,您可以将处理程序与 HTTP 方法和路径组合相关联。这样,您可以根据客户端使用的方法将发送到单个路径的请求单独路由。
a.如果服务器从上一节开始仍在运行,请停止它。
b.从包含 main.go 的目录中的命令行,运行代码。
c.从不同的命令行窗口,用于curl向正在运行的 Web 服务发出请求。
该命令应显示添加专辑的标题和 JSON。
d.与上一节一样,使用curl检索完整的专辑列表,您可以使用它来确认添加了新专辑。
该命令应显示专辑列表。
当客户端向 发出请求时GET /albums/[id],您希望返回 ID 与id路径参数匹配的专辑。
为此,您将:
a.在您在上一节中添加的函数下方postAlbums,粘贴以下代码以检索特定专辑。
此getAlbumByID函数将提取请求路径中的 ID,然后找到匹配的专辑。
在此代码中:
(1)Context.Param用于从 URL 中检索id路径参数。当您将此处理程序映射到路径时,您将在路径中包含参数的占位符。
(2)循环album切片中的结构,寻找其ID 字段值与id参数值匹配的结构。如果找到,则将该album结构序列化为 JSON,并将其作为带有200 OK HTTP 代码的响应返回。
如上所述,实际使用中的服务可能会使用数据库查询来执行此查找。
(3)如果找不到专辑,则返回 HTTP 404错误。
b.最后,更改您的main,使其包含对router.GET的新调用,路径现在为/albums/:id ,如以下示例所示。
在此代码中:
(1)将/albums/:id路径与getAlbumByID功能相关联。在 Gin 中,路径中项目前面的冒号表示该项目是路径参数。
a.如果服务器从上一节开始仍在运行,请停止它。
b.在包含 main.go 的目录中的命令行中,运行代码以启动服务器。
c.从不同的命令行窗口,用于curl向正在运行的 Web 服务发出请求。
该命令应显示您使用其 ID 的专辑的 JSON。如果找不到专辑,您将收到带有错误消息的 JSON。
恭喜!您刚刚使用 Go 和 Gin 编写了一个简单的 RESTful Web 服务。
本节包含您使用本教程构建的应用程序的代码。