文心一言 VS 讯飞星火 VS chatgpt (154)-- 算法导论12.3 1题
一、用go语言,给出 TREE-INSERT 过程的一个递归版本。
文心一言,代码不能运行:
下面是用 Go 语言实现一个递归版本的 TREE-INSERT 过程的代码:
package main
import "fmt"
type TreeNode struct {
Val int
Left *TreeNode
Right *TreeNode
}
func insert(root *TreeNode, val int) *TreeNode {
if root == nil {
return &TreeNode{Val: val, Left: nil, Right: nil}
}
if val < root.Val {
root.Left = insert(root.Left, val)
} else if val > root.Val {
root.Right = insert(root.Right, val)
}
return root
}
func inorderTraversal(root *TreeNode) {
if root != nil {
inorderTraversal(root.Left)
fmt.Println(root.Val)
inorderTraversal(root.Right)
}
}
func main() {
root := nil
root = insert(root, 5)
insert(root, 3)
insert(root, 7)
insert(root, 1)
insert(root, 9)
inorderTraversal(root)
}
在这个代码中,我们定义了一个 TreeNode 结构体来表示二叉树节点。insert 函数用于将一个值插入到二叉搜索树中,它采用递归的方式实现。如果当前节点为空,则创建一个新的节点作为根节点;否则,根据值的大小,递归地插入到左子树或右子树中。最后返回根节点。我们还定义了一个 inorderTraversal 函数来验证树的正确性,它会按照中序遍历的顺序打印出节点的值。在 main 函数中,我们创建了一个二叉搜索树,并插入了一些值。然后调用 inorderTraversal 函数来验证结果。


讯飞星火,代码正常运行:
package main
import (
"fmt"
)
type TreeNode struct {
Value int
Left, Right *TreeNode
}
func TreeInsert(root *TreeNode, value int) *TreeNode {
if root == nil {
return &TreeNode{Value: value}
}
if value < root.Value {
root.Left = TreeInsert(root.Left, value)
} else if value > root.Value {
root.Right = TreeInsert(root.Right, value)
}
return root
}
func main() {
root := &TreeNode{Value: 50}
root = TreeInsert(root, 30)
root = TreeInsert(root, 70)
root = TreeInsert(root, 20)
root = TreeInsert(root, 40)
root = TreeInsert(root, 60)
root = TreeInsert(root, 80)
fmt.Println("树的结构:")
printInOrder(root)
}
func printInOrder(node *TreeNode) {
if node != nil {
printInOrder(node.Left)
fmt.Printf("%d ", node.Value)
printInOrder(node.Right)
}
}


360智脑:
以下是一个递归版本的 TREE-INSERT 过程:
package main
import (
<t>"fmt"
)
//定义树
type BinaryTree struct {
<t>value int
<t>left, right *BinaryTree
}
//新树
func NewBinaryTree(rootVal int) *BinaryTree {
<t>return &BinaryTree{value: rootVal, left: nil, right: nil}
}
//插入树
func (bst *BinaryTree) Insert(val int) {
<t>if bst == nil || val < bst.value {
<t><t>bst.left = NewBinaryTree(val)
<t>} else if val > bst.value {
<t><t>bst.right = NewBinaryTree(val)
<t>} else {
<t><t>fmt.Println("错误:值必须在树中")
<t><t>return
<t>}
<t>bst.value = val
}
func main() {
<t>//定义切片存放树的元素
<t>array := []int{6, 3, 8, 2, 5, 1, 7}
<t>var bst *BinaryTree
<t>for _, v := range array {
<t><t>bst = bst.Insert(v)
<t>}
<t>fmt.Println("插入后的树:")
<t>bst.PreOrder()
<t>fmt.Println()
<t>bst.InOrder()
<t>fmt.Println()
<t>bst.PostOrder()
}


智谱清言,代码不能运行:
在计算机科学中,二叉搜索树(BST)是一种特殊的二叉树,它具有以下性质:
每个节点都有一个作为关键字的值,该值唯一存在于树中。
左子树上所有节点的值均小于它的根节点的值。
右子树上所有节点的值均大于它的根节点的值。
TREE-INSERT 过程是在 BST 中插入一个新值的过程。这里给出一个用 Go 语言编写的递归版本的 TREE-INSERT 过程:
package main
import (
"fmt"
)
type TreeNode struct {
Value int
Left *TreeNode
Right *TreeNode
}
// TREE-INSERT 过程的递归版本
func treeInsert(t *TreeNode, key int) *TreeNode {
// 如果当前节点是nil(即到达了树的末端),则创建一个新节点
if t == nil {
return &TreeNode{Value: key}
}
// 如果新键值小于当前节点的键值,则在左子树中递归插入
if key < t.Value {
t.Left = treeInsert(t.Left, key)
} else if key > t.Value { // 如果新键值大于当前节点的键值,则在右子树中递归插入
t.Right = treeInsert(t.Right, key)
}
// 返回当前节点(可能已经更新)
return t
}
func main() {
// 创建一个空的二叉搜索树
root := nil
// 向树中插入一些键值
root = treeInsert(root, 5)
root = treeInsert(root, 3)
root = treeInsert(root, 8)
root = treeInsert(root, 1)
root = treeInsert(root, 4)
root = treeInsert(root, 6)
root = treeInsert(root, 9)
root = treeInsert(root, 2)
root = treeInsert(root, 7)
// 以 inorder 遍历的方式打印树,验证是否正确插入
var inorder func(t *TreeNode)
inorder = func(t *TreeNode) {
if t == nil {
return
}
inorder(t.Left)
fmt.Println(t.Value)
inorder(t.Right)
}
// 开始 inorder 遍历
inorder(root)
}
在这个代码中,treeInsert 函数以递归方式向 BST 中插入一个新值。如果当前节点是 nil,它将返回一个新节点。如果新值小于当前节点的值,它将在左子树中递归插入,如果新值大于当前节点的值,它将在右子树中递归插入。main 函数中展示了如何使用 treeInsert 函数,并通过 inorder 遍历打印出树的键值,以验证插入是否正确。


通义千问,代码正常运行:
在 Go 语言中,你可以使用递归来实现 TREE-INSERT 过程。这里是一个简单的示例,假设你有一个名为 Tree 的结构体表示二叉搜索树(BST)的节点,并且该结构体包含一个指向左子节点和右子节点的指针以及一个值。
package main
import "fmt"
type Tree struct {
value int
left *Tree
right *Tree
}
// Recursive TREE_INSERT function
func treeInsert(root **Tree, z *Tree) {
if *root == nil {
*root = z
return
}
// Compare the new node's value with the current root's value
if (*root).value > z.value {
// If the new node's value is smaller, insert into the left subtree
treeInsert(&(*root).left, z)
} else {
// If the new node's value is larger or equal, insert into the right subtree
treeInsert(&(*root).right, z)
}
}
func main() {
var root *Tree
z := &Tree{value: 10}
treeInsert(&root, z)
y := &Tree{value: 5}
treeInsert(&root, y)
x := &Tree{value: 15}
treeInsert(&root, x)
fmt.Println("In-order traversal:")
inorderTraversal(root)
}
// Helper function to print in-order traversal of a binary search tree
func inorderTraversal(t *Tree) {
if t != nil {
inorderTraversal(t.left)
fmt.Printf("%d ", t.value)
inorderTraversal(t.right)
}
}
在这个例子中,我们首先定义了一个 Tree 结构体来表示二叉搜索树的节点。接下来,我们实现了 treeInsert 函数,它接受一个指向树根的指针和一个新的节点 z。函数通过比较新节点的值与当前根节点的值来决定将新节点插入到左子树还是右子树。如果当前根为空,那么新节点就成为新的根节点。
在 main 函数中,我们创建了一个空的根节点,并使用 treeInsert 函数插入了几个新节点。最后,我们调用了一个辅助函数 inorderTraversal 来打印出二叉搜索树的中序遍历结果。
请注意,这个示例仅用于演示如何使用递归实现 TREE-INSERT 过程。在实际应用中,你需要根据你的具体需求对代码进行调整。


天工:
好的,以下是一个使用 Go 语言实现的 TREE-INSERT 过程的递归版本:
func TREE_INSERT(root *Node, z *Node) *Node {
// 如果根节点为空,则创建一个新节点作为根节点
if root == nil {
root = &Node{key: z.key, val: z.val}
return root
}
// 如果根节点的键小于 z 的键
if root.key < z.key {
// 将 z 插入到根节点的左子树中
root.left = TREE_INSERT(root.left, z)
return root
}
// 如果根节点的键等于 z 的键
root.right = TREE_INSERT(root.right, z)
// 返回根节点
return root
}
其中,Node 结构体定义如下:
type Node struct {
key int
val int
left *Node
right *Node
}
该递归版本的实现思路与参考信息中的伪代码基本一致。当递归到叶子节点时,返回的根节点即为最后一个插入的元素。


灵小智,代码正常运行:
以下是一个用Go语言编写的递归版本的TREE-INSERT过程示例:
package main
import "fmt"
type Node struct {
key int
left *Node
right *Node
}
func insert(root *Node, key int) *Node {
if root == nil {
root = &Node{key: key, left: nil, right: nil}
return root
}
if key < root.key {
root.left = insert(root.left, key)
} else if key > root.key {
root.right = insert(root.right, key)
}
return root
}
func inorder(root *Node) {
if root != nil {
inorder(root.left)
fmt.Printf("%d ", root.key)
inorder(root.right)
}
}
func main() {
var root *Node
keys := []int{15, 10, 20, 8, 12, 18, 25}
for _, key := range keys {
root = insert(root, key)
}
fmt.Println("Inorder traversal of the binary search tree:")
inorder(root)
}
以上代码定义了一个名为Node的结构体,表示二叉搜索树中的节点。insert函数是一个递归函数,用于插入一个新的键值到二叉搜索树中。inorder函数用于按照中序遍历的顺序输出二叉搜索树中的节点。
在main函数中,我们创建一个空的二叉搜索树,并依次插入一些键值。最后,调用inorder函数打印二叉搜索树的中序遍历结果。
请注意,这只是一个示例,并没有涉及错误处理和其他边界情况的处理。实际使用时,您可能需要进行适当的错误处理和鲁棒性改进。


chatgpt:
以下是一个使用递归实现的TREE-INSERT过程的示例代码(假设节点数据类型为整数):
type Node struct {
key int
left *Node
right *Node
}
func insert(root *Node, key int) *Node {
if root == nil {
return &Node{key: key}
}
if key < root.key {
root.left = insert(root.left, key)
} else if key > root.key {
root.right = insert(root.right, key)
}
return root
}
你可以将上述代码中的insert函数作为TREE-INSERT过程的递归版本。它会接收一个二叉搜索树的根节点和要插入的关键字作为参数,然后在树中递归地插入新节点,最终返回更新后的根节点。

kimi,抛panic:
在 Go 语言中,我们可以实现一个递归版本的 TREE-INSERT 过程。以下是一个简单的实现:
package main
type Node struct {
key interface{} // 可以是任何可比较的数据类型,如 int、string 等
left *Node
right *Node
}
func (n *Node) TreeInsert(key interface{}) *Node {
if n == nil {
return &Node{key: key}
}
if key.(int) < n.key.(int) {
n.left = n.left.TreeInsert(key)
} else {
n.right = n.right.TreeInsert(key)
}
return n
}
func main() {
root := &Node{}
keys := []int{8, 3, 10, 1, 6, 14, 4, 7, 13}
for _, key := range keys {
root = root.TreeInsert(key)
}
// 中序遍历(左子树 -> 当前节点 -> 右子树),输出二叉搜索树的元素
inOrderTraversal(root)
}
func inOrderTraversal(n *Node) {
if n != nil {
inOrderTraversal(n.left)
fmt.Println(n.key)
inOrderTraversal(n.right)
}
}
在这个实现中,我们首先定义了一个 Node 结构体,表示二叉搜索树的节点。TreeInsert 方法是一个递归方法,它接受一个关键字作为参数。当树为空时,我们创建一个新的节点。然后,我们根据给定的关键字与当前节点的关键字的大小关系,将其插入到左子树或右子树中。
在 main 函数中,我们创建了一个空的根节点,并插入了一些整数。然后,我们使用 inOrderTraversal 函数按顺序遍历二叉搜索树并输出其元素。这个函数也是一个递归函数,它按照左子树 -> 当前节点 -> 右子树的顺序遍历树的节点。


文心一言 VS 讯飞星火 VS chatgpt (154)-- 算法导论12.3 1题的更多相关文章
- 【对比】文心一言对飚ChatGPT实操对比体验
前言 缘由 百度[文心一言]体验申请通过 本狗中午干饭时,天降短信,告知可以体验文心一言,苦等一个月的实操终于到来.心中这好奇的对比心理油然而生,到底是老美的[ChatGPT]厉害,还是咱度娘的[文心 ...
- 【个人首测】百度文心一言 VS ChatGPT GPT-4
昨天我写了一篇文章GPT-4牛是牛,但这几天先别急,文中我测试了用GPT-4回答ChatGPT 3.5 和 Notion AI的问题,大家期待的图片输入也没有出现. 昨天下午百度发布了文心一言,对标C ...
- 文心一言,通营销之学,成一家之言,百度人工智能AI大数据模型文心一言Python3.10接入
"文心"取自<文心雕龙>一书的开篇,作者刘勰在书中引述了一个古代典故:春秋时期,鲁国有一位名叫孔文子的大夫,他在学问上非常有造诣,但是他的儿子却不学无术,孔文子非常痛心 ...
- 获取了文心一言的内测及与其ChatGPT、GPT-4 对比结果
百度在3月16日召开了关于文心一言(知识增强大语言模型)的发布会,但是会上并没现场展示demo.如果要测试的文心一言 也要获取邀请码,才能进行测试的. 我这边通过预约得到了邀请码,大概是在3月17日晚 ...
- 百度生成式AI产品文心一言邀你体验AI创作新奇迹:百度CEO李彦宏详细透露三大产业将会带来机遇(文末附文心一言个人用户体验测试邀请码获取方法,亲测有效)
目录 中国版ChatGPT上线发布 强大中文理解能力 智能文学创作.商业文案创作 图片.视频智能生成 中国生成式AI三大产业机会 新型云计算公司 行业模型精调公司 应用服务提供商 总结 获取文心一言邀 ...
- 阿里版ChatGPT:通义千问pk文心一言
随着 ChatGPT 热潮卷起来,百度发布了文心一言.Google 发布了 Bard,「阿里云」官方终于也宣布了,旗下的 AI 大模型"通义千问"正式开启测试! 申请地址:http ...
- 基于讯飞语音API应用开发之——离线词典构建
最近实习在做一个跟语音相关的项目,就在度娘上搜索了很多关于语音的API,顺藤摸瓜找到了科大讯飞,虽然度娘自家也有语音识别.语义理解这块,但感觉应该不是很好用,毕竟之前用过百度地图的API,有问题也找不 ...
- android用讯飞实现TTS语音合成 实现中文版
Android系统从1.6版本开始就支持TTS(Text-To-Speech),即语音合成.但是android系统默认的TTS引擎:Pic TTS不支持中文.所以我们得安装自己的TTS引擎和语音包. ...
- android讯飞语音开发常遇到的问题
场景:android项目中共使用了3个语音组件:在线语音听写.离线语音合成.离线语音识别 11208:遇到这个错误,授权应用失败,先检查装机量(3台测试权限),以及appid的申请时间(35天期限), ...
- 初探机器学习之使用讯飞TTS服务实现在线语音合成
最近在调研使用各个云平台提供的AI服务,有个语音合成的需求因此就使用了一下科大讯飞的TTS服务,也用.NET Core写了一个小示例,下面就是这个小示例及其相关背景知识的介绍. 一.什么是语音合成(T ...
随机推荐
- centos7.X安装nginx – 东凭渭水流
1.安装nginx需要使用root用户 2.配置nginx源 rpm -ivh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release ...
- WPF-封装自定义雷达图控件
源码地址:https://gitee.com/LiuShuiRuoBing/code_blog 雷达图用于表示不同内容的占比关系,在项目中有广泛的应用,但是目前未曾有封装良好的雷达图控件,鉴于最近项目 ...
- Python字符串操作函数split()和join()
字符串拆分 在python中有切片(Slice)操作符,可以对字符串进行截取,还提供了split()函数可以将一个 字符串分裂成多个字符串组成的列表.在使用split()函数来拆分字符串之前,我们先来 ...
- 《Linux基础》07. 软件管理
@ 目录 1:软件管理 1.1:rpm 1.1.1:查询 1.1.2:卸载 1.1.3:安装 1.2:yum 1.3:dpkg 1.4:apt 1.4.1:相关配置 1.4.2:常用指令 1.4.3: ...
- KRPANO最新完整汉化中文版 (KRPANO-1.19-PR10-WIN汉化版)
KRPano 最新版本汉化krpano-1.19-pr10-win,由KRPano技术解密群:551278936 提供. 下载地址:http://pan.baidu.com/s/1bBmD5c 如果需 ...
- vue3探索——pinia高阶使用
以下是一些 Pinia 的其他高阶功能: storeToRefs():响应式解构仓库,保证解构出来的数据是响应式的数据. 状态持久化:Pinia 并没有内置的状态持久化功能,但你可以使用第三方库或自定 ...
- flutter的json转dart model问题
原文链接 原文链接 Preface 最近在做一个app,以后续用来找工作可以拿出来看看. 试试自己到产品设计能力,前后端能力等等. 中间遇到到一些有值得记录的点全部记录在此. Content json ...
- 位图(bitmap)原理以及实现
大家好,我是蓝胖子,我一直相信编程是一门实践性的技术,其中算法也不例外,初学者可能往往对它可望而不可及,觉得很难,学了又忘,忘其实是由于没有真正搞懂算法的应用场景,所以我准备出一个系列,囊括我们在日常 ...
- 「Semigroup と Monoid と Functional と」
一个被国内 oi 环境弱化至几乎不存在的概念,不过我觉得还是有学一学的必要.因为我没学过代数结构所以大部分内容都在开黄腔,欲喷从轻. Semigroup 的定义是,\(\forall a,b\in\m ...
- Arduino – Turn LED ON and OFF With Button
In this Arduino tutorial I will show you how to turn an LED on and off with a push button. In fact, ...