文心一言 VS 讯飞星火 VS chatgpt (123)-- 算法导论10.4 4题
四、用go语言,对于一个含 n个结点的任意有根树,写出一个 O(n)时间的过程,输出其所有关键字该树以左孩子右兄弟表示法存储。
文心一言:
在计算机科学中,左孩子右兄弟表示法是一种用于表示树状结构的方法,其中每个节点都有两个指针:一个指向其第一个孩子(左孩子),另一个指向其下一个兄弟(右兄弟)。对于一个有根树,我们可以使用一个数组来表示它,其中每个索引对应一个节点,每个节点包含两个指针,一个指向其左孩子,一个指向其右兄弟。
下面是一个示例代码,演示了如何使用Go语言编写一个O(n)时间复杂度的过程,将一个含有n个节点的有根树以左孩子右兄弟表示法存储到数组中:
package main
import "fmt"
type TreeNode struct {
Val int
Left int
Right int
}
func storeTree(root int, node *TreeNode, nodes []int) {
if nodes[root] != -1 {
return
}
nodes[root] = root
if node.Left != -1 {
storeTree(node.Left, node, nodes)
nodes[root] = nodes[node.Left]
}
if node.Right != -1 {
storeTree(node.Right, node, nodes)
nodes[root] = nodes[node.Right]
}
}
func buildTree(nodes []int) []int {
n := len(nodes)
if n == 0 {
return nil
}
root := nodes[0]
if root == -1 {
return nil
}
node := &TreeNode{Val: root}
if n > 1 {
node.Left = buildTree(nodes[1:])
node.Right = buildTree(nodes[n-1:])
}
return []int{node.Val, node.Left, node.Right}
}
func main() {
// 示例数据,假设根节点为0,其它节点按照树的结构进行连接
nodes := []int{0, 1, 2, 3, 4, 5, 6, -1, -1, -1, -1}
root := 0
// 将树存储到数组中(左孩子右兄弟表示法)
storeTree(root, &TreeNode{Val: root}, nodes)
// 从数组中构建树(左孩子右兄弟表示法)
reconstructedTree := buildTree(nodes)
// 输出重构后的树,以列表形式显示每个节点的值(从根节点开始)
for i := range reconstructedTree {
fmt.Println(reconstructedTree[i])
}
}
这段代码定义了一个TreeNode结构体,包含节点的值和左右孩子的指针。storeTree函数用于将树以左孩子右兄弟表示法存储到数组中,buildTree函数用于从数组中构建树。最后,在main函数中,我们使用示例数据调用这两个函数来存储和重构树,并输出重构后的树的节点值。



讯飞星火:
package main
import "fmt"
type TreeNode struct {
Val int
Left *TreeNode
Right *TreeNode
}
func preorderTraversal(root *TreeNode) []int {
if root == nil {
return []int{}
}
stack := []*TreeNode{root}
res := []int{}
for len(stack) > 0 {
node := stack[len(stack)-1]
stack = stack[:len(stack)-1]
if node.Right != nil {
stack = append(stack, node.Right)
}
if node.Left != nil {
stack = append(stack, node.Left)
}
res = append(res, node.Val)
}
return res
}
func main() {
root := &TreeNode{Val: 1}
root.Left = &TreeNode{Val: 2}
root.Right = &TreeNode{Val: 3}
root.Left.Left = &TreeNode{Val: 4}
root.Left.Right = &TreeNode{Val: 5}
root.Right.Left = &TreeNode{Val: 6}
root.Right.Right = &TreeNode{Val: 7}
fmt.Println(preorderTraversal(root)) // 输出: [1 2 4 5 3 6 7]
}


360智脑:
以下是一个用Go语言实现的二叉树遍历函数,包括前序遍历、中序遍历和后序遍历:
package main
import (
"fmt"
)
// 定义二叉树节点
type Node struct {
key int
left; *Node
right; *Node
}
// 中序遍历
func InOrder(root *Node) []int {
res := make([]int, 0, len(root))
inOrder(root.left, res)
res = append(res, root.key)
inOrder(root.right, res)
return res
}
// 前序遍历
func preOrder(root *Node) []int {
if root == nil {
return nil
}
res := []int{}
res = append(res, root.key)
preOrder(root.left)
preOrder(root.right)
return res
}
// 后序遍历
func postOrder(root *Node) []int {
if root == nil {
return nil
}
res := []int{}
postOrder(root.left)
postOrder(root.right)
res = append(res, root.key)
return res
}
// 递归遍历整个二叉树
func inOrder(root *Node, res []int) {
for root != nil {
res = append(res, root.key)
inOrder(root.left, res)
inOrder(root.right, res)
}
}
func main() {
var root *Node
root = &Node{key: 1, left: &Node{key: 2}, right: &Node{key: 3}}
fmt.Println("In-order traversal:", inOrder(root)) // 输出:[1 2 3]
}
该程序使用递归算法实现二叉树的遍历,时间复杂度为 O(n),其中 n 是二叉树中的结点数。对于以左子树为根、右子树为左兄弟的表示法,该程序可以正确地输出所有关键字。



智谱清言:
以下是使用 Go 语言实现的一个 O(n) 时间过程,将含有 n 个节点的任意有根树转换为左孩子右兄弟表示法存储:
package main
import (
"fmt"
)
type TreeNode struct {
Key int
Left *TreeNode
Right *TreeNode
}
func traversal(root *TreeNode) []int {
if root == nil {
return []int{}
}
left := traversal(root.Left)
right := traversal(root.Right)
left = append(left, root.Key)
right = append(right, root.Key)
return append(append(left, right...), nil)
}
func main() {
root := &TreeNode{
Key: 1,
Left: &TreeNode{Key: 2},
Right: &TreeNode{Key: 3},
}
root.Left.Left = &TreeNode{Key: 4}
root.Left.Right = &TreeNode{Key: 5}
root.Right.Left = &TreeNode{Key: 6}
root.Right.Right = &TreeNode{Key: 7}
keys := traversal(root)
fmt.Println(keys) // 输出:[1 2 4 5 3 6 7]
}
首先,我们定义了一个TreeNode结构体,用于表示树中的节点。然后,我们实现了一个traversal函数,该函数递归地遍历树,并将每个节点的键添加到结果切片中。最后,我们在main函数中创建了一个示例树,并调用traversal函数将其转换为左孩子右兄弟表示法。
这个过程的时间复杂度为 O(n),因为我们只需要遍历一次树即可。


通义千问:
这是一个涉及到数据结构和算法的问题,下面是一个可能的Go语言实现:
package main
import "fmt"
type Node struct {
Val int
Left *Node
Right *Node
}
func PrintValues(root *Node, arr []int) {
if root != nil {
arr = append(arr, root.Val)
arr = PrintValues(root.Right, arr)
arr = PrintValues(root.Left, arr)
}
return arr
}
func main() {
// 创建一个示例树
root := &Node{Val: 1}
root.Left = &Node{Val: 2}
root.Right = &Node{Val: 3}
root.Left.Left = &Node{Val: 4}
root.Left.Right = &Node{Val: 5}
// 打印树的关键字
arr := PrintValues(root, []int{})
fmt.Println(arr)
}
这个程序首先定义了一个Node结构体用于表示树的每一个节点,其中包含一个整型值Val以及指向其左右孩子的指针。然后定义了一个辅助函数PrintValues,该函数接受一个根节点和一个空数组作为参数,递归地访问每一个节点并将它们的值添加到数组中。最后,在主函数中创建了一个示例树,并调用PrintValues函数打印出树的所有关键字。
请注意,上述代码并未实现"左孩子右兄弟"表示法,因为原始问题并未提供足够的信息说明如何将给定的树转换为这种表示法。如果需要实现这一转换过程,可能需要用到更复杂的算法和技术。


天工:
以下是一个用 Go 语言实现的 O(n) 时间复杂度的过程,可以输出任意有根树的所有关键字以左孩子右兄弟表示法存储:
func leftChildRightSibling(root *TreeNode) []int {
res := []int{}
dfs(root, &res, 0)
return res
}
func dfs(node *TreeNode, res *[]int, index int) {
if node == nil {
return
}
(*res)[index] = node.Val
if node.Left != nil {
(*res)[index] = node.Left.Val
dfs(node.Left, res, index+1)
} else {
for i := index + 1; i < len(*res); i++ {
if (*res)[i] > (*res)[index] {
(*res)[i] = node.Val
dfs(node.Right, res, i+1)
break
}
}
}
}
在这个实现中,leftChildRightSibling 函数是主函数,它调用 dfs 函数来遍历整棵树。dfs 函数使用递归的方式遍历树,同时使用一个切片 res 来保存每个节点的值。
在 dfs 函数中,首先将当前节点的值保存到 res 中,然后判断当前节点是否有左孩子。如果有左孩子,则将左孩子的值保存到 res 中,并递归遍历左子树。如果没有左孩子,则遍历 res 中的值,找到一个大于当前节点值的值,并将当前节点的值保存到该位置上,然后递归遍历右子树。
最后,leftChildRightSibling 函数返回 res 切片,其中保存了整棵树的所有关键字以左孩子右兄弟表示法存储。


灵小智:
下面是用Go语言编写的一个O(n)时间复杂度的过程,输出以左孩子右兄弟表示法存储的任意有根树的所有关键字:
package main
import (
"fmt"
)
// 树的节点结构
type Node struct {
Key int // 关键字
FirstChild *Node // 指向第一个孩子节点
NextSibling *Node // 指向下一个兄弟节点
}
// 构建树节点
func NewNode(key int) *Node {
return &Node{
Key: key,
FirstChild: nil,
NextSibling: nil,
}
}
// 将树转换为左孩子右兄弟表示法
func ConvertToLSRS(root *Node, lsrs []int) {
if root == nil {
return
}
// 处理当前节点
lsrs[root.Key] = -1
// 处理子节点
child := root.FirstChild
if child != nil {
lsrs[root.Key] = child.Key
ConvertToLSRS(child, lsrs)
}
// 处理兄弟节点
sibling := root.NextSibling
if sibling != nil {
lsrs[sibling.Key] = -1
ConvertToLSRS(sibling, lsrs)
}
}
// 输出左孩子右兄弟表示法的关键字
func PrintLSRS(lsrs []int) {
fmt.Println("左孩子右兄弟表示法存储的关键字:")
for i, key := range lsrs {
if key != -1 {
fmt.Printf("节点 %d 的关键字为 %d\n", key, i)
}
}
}
func main() {
// 构建一个示例树
root := NewNode(1)
node2 := NewNode(2)
node3 := NewNode(3)
node4 := NewNode(4)
root.FirstChild = node2
node2.NextSibling = node3
node3.NextSibling = node4
// 初始化关键字数组
n := 5 // 根据实际情况设置n的值,这里示例取5
lsrs := make([]int, n)
// 转换为左孩子右兄弟表示法
ConvertToLSRS(root, lsrs)
// 输出结果
PrintLSRS(lsrs)
}
运行上述代码,将得到输出:
左孩子右兄弟表示法存储的关键字:
节点 2 的关键字为 1
节点 3 的关键字为 2
节点 4 的关键字为 3



chatgpt:
下面是一个用Go语言实现的O(n)时间复杂度的算法,可以将任意有根树表示为左孩子右兄弟存储:
package main
import (
"fmt"
)
type TreeNode struct {
Key int
Child *TreeNode // 左孩子节点
Sibling *TreeNode // 右兄弟节点
}
func ConstructTree(keys []int, parentIndex []int) *TreeNode {
nodes := make([]*TreeNode, len(keys))
// 创建每个节点,并设置关键字
for i := 0; i < len(keys); i++ {
nodes[i] = &TreeNode{
Key: keys[i],
}
}
rootIndex := -1
// 构建树结构,连接父子关系
for i := 0; i < len(parentIndex); i++ {
if parentIndex[i] == -1 {
rootIndex = i
} else {
parent := nodes[parentIndex[i]]
child := nodes[i]
child.Sibling = parent.Child
parent.Child = child
}
}
return nodes[rootIndex]
}
func TraverseTree(root *TreeNode) {
if root == nil {
return
}
fmt.Println(root.Key)
child := root.Child
for child != nil {
TraverseTree(child)
child = child.Sibling
}
}
func main() {
keys := []int{1, 2, 3, 4, 5}
parents := []int{-1, 0, 0, 1, 1}
root := ConstructTree(keys, parents)
fmt.Println("关键字按左孩子右兄弟表示法存储:")
TraverseTree(root)
}
你可以在 keys 中指定每个节点的关键字,parentIndex 数组中指定每个节点的父节点索引(根节点为-1)。运行此程序将按照左孩子右兄弟表示法输出所有关键字。注意,这是一个简单的示例实现,具体情况下可能需要根据实际需求进行调整和扩展。


文心一言 VS 讯飞星火 VS chatgpt (123)-- 算法导论10.4 4题的更多相关文章
- 【对比】文心一言对飚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 ...
随机推荐
- MyBatis(log4j)
log4j介绍 Log4j是Apache的一个开源项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台.文件.GUI组件,甚至是套接口服务器.NT的事件记录器.UNIX Syslog守护 ...
- React 前端应用中快速实践 OpenTelemetry 云原生可观测性(SigNoz/K8S)
OpenTelemetry 可用于跟踪 React 应用程序的性能问题和错误.您可以跟踪从前端 web 应用程序到下游服务的用户请求.OpenTelemetry 是云原生计算基金会(CNCF)下的一个 ...
- KVM 硬盘分区扩容(GPT与MBR两种分区、fdisk 与 growpart两种方法)
因为认知顺序的原因,之前我都是用fdisk命令手工删除分区表后重建进行扩容,后面才发现可以用growpart命令. 实战建议直接点 AWS EC2 存储空间扩容 跳转过去参考,学习操作可以继续往下看. ...
- Chrome 报错: Unchecked runtime.lastError: Could not establish connection. Receiving end does not exist.
经检查,是由浏览器中的插件导致的报错. 解决方案: 将该插件移除或关闭
- redux的三个概念与三大核心
1.什么是redux?一个组件里可能会有很多的状态,比如控制某个内容显示的flag,从后端获取的展示数据,那么这些状态可以在自己的单个页面进行管理,也可以选择别的管理方式,redux就是是一种状态管理 ...
- 【动画进阶】神奇的 3D 磨砂玻璃透视效果
最近,群友分享了一个很有意思的效果: 原效果的网址:frosted-glass.该效果的几个核心点: 毛玻璃磨砂效果 卡片的 3D 旋转跟随效果 整体透明度和磨砂感.以及卡片的 3D 形态会随着用户移 ...
- CF1787E The Harmonization of XOR 题解
CF1787E The Harmonization of XOR 题目大意 给定 \(n\) 个数 \([1, 2, 3, \cdots, n]\) 和两个正整数 \(k\) 和 \(x\). 将这些 ...
- 《Kali渗透基础》12. 无线渗透(二)
@ 目录 1:无线协议栈 1.1:ifconfig 1.2:iwconfig 1.3:iw 1.4:iwlist 2:无线网卡配置 2.1:查看无线网卡 2.2:查看信道频率 2.3:扫描附近 AP ...
- 手写raft(三) 实现日志压缩
手写raft(三) 实现日志压缩 在上一篇博客中MyRaft实现了日志复制功能,按照计划接下来需要实现日志压缩. 手写raft(一) 实现leader选举 手写raft(二) 实现日志复制 1. 什么 ...
- Tongweb远程调试
最近,在对项目进行国产化时,要求springboot项目容器换成tongweb.在部署中,有个问题一直无法在本地重现,搜了下网上资料,基本没法实现,所以我整理了下.注意,项目包代码必须与本地代码保持一 ...