文心一言 VS 讯飞星火 VS chatgpt (122)-- 算法导论10.4 3题
三、用go语言,给定一个n结点的二叉树,写出一个 O(n)时间的非递归过程,将该树每个结点的关键字输出。可以使用一个栈作为辅助数据结构。
文心一言:
以下是一个使用 Go 语言编写的函数,该函数使用一个栈作为辅助数据结构,以非递归方式遍历二叉树,输出每个结点的关键字。这个算法的时间复杂度为 O(n)。
package main
import "fmt"
type TreeNode struct {
Key int
Left *TreeNode
Right *TreeNode
}
func printTree(root *TreeNode) {
if root == nil {
return
}
stack := []*TreeNode{root}
for len(stack) > 0 {
node := stack[len(stack)-1]
stack = stack[:len(stack)-1]
fmt.Println(node.Key)
// 右节点入栈
if node.Right != nil {
stack = append(stack, node.Right)
}
// 左节点入栈
if node.Left != nil {
stack = append(stack, node.Left)
}
}
}
在上述代码中,我们首先检查根节点是否为空。如果为空,则直接返回。然后我们创建一个栈,并将根节点放入栈中。接下来,我们开始一个循环,只要栈不为空,我们就持续进行以下操作:
1.取出栈顶元素。
2.打印该节点的关键字。
3.如果存在右节点,则将右节点放入栈中。
4.如果存在左节点,则将左节点放入栈中。
5.重复上述步骤,直到栈为空。


讯飞星火:
首先,我们需要定义一个二叉树节点的结构体,然后使用一个栈来辅助遍历二叉树。具体步骤如下:
- 初始化一个空栈,将根节点压入栈中。
- 当栈不为空时,执行以下操作:
a. 弹出栈顶元素,输出该元素的关键字。
b. 如果该元素有右子节点,将右子节点压入栈中。
c. 如果该元素有左子节点,将左子节点压入栈中。 - 重复步骤2,直到栈为空。
以下是用Go语言实现的代码:
package main
import "fmt"
type TreeNode struct {
Val int
Left *TreeNode
Right *TreeNode
}
func inorderTraversal(root *TreeNode) {
if root == nil {
return
}
stack := []*TreeNode{}
node := root
for node != nil || len(stack) > 0 {
for node != nil {
stack = append(stack, node)
node = node.Left
}
node = stack[len(stack)-1]
stack = stack[:len(stack)-1]
fmt.Println(node.Val)
node = node.Right
}
}
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}
inorderTraversal(root)
}
这段代码首先定义了一个二叉树节点的结构体TreeNode,然后实现了一个非递归的中序遍历函数inorderTraversal,最后在main函数中创建了一个示例二叉树并调用inorderTraversal函数进行遍历。


360智脑:
以下是一个使用栈的非递归遍历二叉树的方法,可以输出每个结点的关键字:
package main
import (
"fmt"
)
type Node struct {
data int
left *Node
right *Node
}
func printTree(root *Node) {
if root == nil {
return
}
stack := []int{root.data}
for _, v := range stack {
fmt.Printf("%d ", v)
}
node := stack[len(stack)-1]
left := root.left
right := root.right
stack = []int{}
for node != nil {
stack = append(stack, node.data)
node = node.left
}
fmt.Println()
}
func main() {
root := &Node{data: 10, left: &Node{}, right: &Node{data: 20}}
printTree(root)
}
该程序首先创建一个包含当前结点的值的数组,并使用一个循环将数组中的元素依次输出。然后,程序将当前结点存储在栈中,并使用另一个循环将当前结点的左子树和右子树的结点分别推入栈中。最后,程序再次输出数组,以完成遍历。
该方法的时间复杂度为O(n),其中n是二叉树中的结点数,因为它只遍历了树的深度,而没有进行任何嵌套遍历。


智谱清言:
package main
import "fmt"
type Node struct {
Key int
Left *Node
Right *Node
}
func levelOrder(root *Node) {
if root == nil {
return
}
stack := make([]*Node, 0)
stack = append(stack, root)
for len(stack) > 0 {
node := stack[len(stack)-1]
stack = stack[:len(stack)-1]
fmt.Print(node.Key, " ")
if node.Left != nil {
stack = append(stack, node.Left)
}
if node.Right != nil {
stack = append(stack, node.Right)
}
}
}
func main() {
root := &Node{Key: 1}
root.Left = &Node{Key: 2}
root.Right = &Node{Key: 3}
root.Left.Left = &Node{Key: 4}
root.Left.Right = &Node{Key: 5}
root.Right.Right = &Node{Key: 6}
levelOrder(root)
}
这个程序首先定义了一个 Node 结构体,用于存储二叉树节点的关键字、左子节点和右子节点。然后,我们实现了一个 levelOrder 函数,它接受一个二叉树的根节点作为参数。
在 levelOrder 函数中,我们使用一个栈作为辅助数据结构。我们首先将根节点压入栈中,然后遍历栈。对于每个节点,我们首先输出它的关键字,然后将它的左右子节点依次压入栈中。当栈为空时,遍历结束。
在 main 函数中,我们创建了一个简单的二叉树,并调用 levelOrder 函数输出每个节点的关键字。输出结果为:1 2 4 5 3 6。


通义千问:
下面是一个Go语言实现的例子:
package main
import (
"fmt"
)
type TreeNode struct {
Val int
Left *TreeNode
Right *TreeNode
}
func levelOrder(root *TreeNode) [][]int {
if root == nil {
return nil
}
var res [][]int
stack := []*TreeNode{root}
for len(stack) > 0 {
tmp := stack
stack = nil
row := []int{}
for _, node := range tmp {
row = append(row, node.Val)
if node.Left != nil {
stack = append(stack, node.Left)
}
if node.Right != nil {
stack = append(stack, node.Right)
}
}
res = append(res, row)
}
return res
}
func printTree(root *TreeNode) {
for i := 0; i < len(levelOrder(root)); i++ {
fmt.Println(levelOrder(root)[i])
}
}
func main() {
root := &TreeNode{1, &TreeNode{2, nil, nil}, &TreeNode{3, nil, nil}}
printTree(root)
}
在这个例子中,我们首先定义了一个二叉树节点的结构体TreeNode,然后定义了一个函数levelOrder用于获取二叉树的层序遍历结果,最后定义了函数printTree用于打印二叉树的所有节点。
在levelOrder函数中,我们使用了一个栈来辅助遍历。首先我们将根节点放入栈中,然后进入循环,每次从栈中取出一个节点,将其值添加到当前行,然后将其左右子节点(如果存在)放入栈中。这样就可以保证每行都是同一层的节点。当栈为空时,说明所有节点都已经处理完毕,此时返回当前行的结果。
在printTree函数中,我们只需要调用levelOrder函数获取所有的层序遍历结果,然后逐行打印即可。


天工:
以下是使用 Go 语言实现 O(n) 时间复杂度的非递归方式遍历二叉树的代码:
type TreeNode struct {
Val int
Left *TreeNode
Right *TreeNode
}
func printTree(root *TreeNode) {
if root == nil {
return
}
// 创建一个栈
stack := make([]*TreeNode, 0)
// 将根节点入栈
stack = append(stack, root)
// 循环直到栈为空
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)
}
// 输出节点的值
fmt.Println(node.Val)
}
}
在上述代码中,我们首先判断根节点是否为空,如果为空,则直接返回。接着,我们创建一个栈,并将根节点入栈。然后,我们循环直到栈为空。
在每次循环中,我们从栈中弹出栈顶节点,并判断该节点是否有右子树和左子树。如果该节点有右子树,则将其入栈;如果该节点有左子树,则将其入栈。最后,我们输出该节点的值。
通过这种方式,我们可以在 O(n) 时间复杂度内遍历二叉树,并输出每个节点的关键字。


chatgpt:
可以使用中序遍历的非递归方式来实现输出二叉树每个节点的关键字。具体步骤如下:
- 初始化一个空栈和一个指针cur,指向根节点。
- 当cur不为空或者栈不为空时,执行以下操作:
- 将cur指向的节点以及其左子树中的所有节点入栈,并将cur更新为其左子节点。
- 弹出并打印栈顶元素,即当前遍历到的节点。
- 将cur更新为当前节点的右子节点。
- 重复步骤2直到cur为空且栈为空。
下面是用Go语言实现上述算法的示例代码:
type TreeNode struct {
Val int
Left *TreeNode
Right *TreeNode
}
func inorderTraversal(root *TreeNode) []int {
var result []int
stack := make([]*TreeNode, 0)
cur := root
for cur != nil || len(stack) > 0 {
// 遍历左子树,将所有左子节点入栈
for cur != nil {
stack = append(stack, cur)
cur = cur.Left
}
// 弹出并打印当前节点
top := stack[len(stack)-1]
stack = stack[:len(stack)-1]
result = append(result, top.Val)
// 更新cur为当前节点的右子节点
cur = top.Right
}
return result
}
通过调用inorderTraversal函数,并传入二叉树的根节点,即可得到按中序遍历顺序输出的节点关键字数组。时间复杂度为O(n),其中n为二叉树节点的数量。


文心一言 VS 讯飞星火 VS chatgpt (122)-- 算法导论10.4 3题的更多相关文章
- 【对比】文心一言对飚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 ...
随机推荐
- CF371D Vessels题解
思路: 定义一个权值并查集,权值保存这个集合还可以存下多少水. 如果这个集合可以存放的水已经小于要装入的水,就将这个集合与下一个集合合并. 否则,直接把这个集合可以存放的水减去要装入的水的体积. 代码 ...
- [转]-- ISP(图像信号处理)算法概述、工作原理、架构、处理流程
目录 ISP的主要内部构成: ISP内部包含 CPU.SUP IP(各种功能模块的通称).IF 等设备 ISP的控制结构:1.ISP逻辑 2.运行在其上的firmware ISP上的Firmware包 ...
- 图像分割_评价指标_PSNR峰值信噪比和SSIM结构相似度
PSNR psnr是"Peak Signal to Noise Ratio"的缩写,即峰值信噪比,是一种评价图像的客观标准. 为了衡量经过处理后的影像品质,我们通常会参考PSNR值 ...
- 「学习笔记」FHQ-treap
FHQ-treap,即无旋 treap,又称分裂合并 treap,支持维护序列,可持久化等特性. FHQ-treap 有两个核心操作,分裂 与 合并.通过这两个操作,在很多情况下可以比旋转 treap ...
- 分布式数据库oceanBase部署
分布式数据库oceanBase部署 相关链接 文档中心 视频中心 软件下载 OceanBase数据库基本操作 OceanBase简介 SQL执行计划 基本概念 为了更好地管理 OceanBase 数据 ...
- ValueError: Max value is 14 解决方案
方案一(有时会失效): 将EXCEL文件中的格式全部清除即可.最好是复制,然后只粘贴值. 方案二(指定引擎): data = pd.read_excel(path, engine="open ...
- AI 一键去水印:教你无限量使用商业图片的技巧
场景再现 刚开始注册账号(啥账号具体不表了,小编不喜欢的那个),想弄个闪亮,好看,有个性化的 Logo.作为一名非专美工小白人员,网上翻了很久作图工具,要么就是不好用,好用的大部分都收费.最后没办法, ...
- Unity的UnityStats: 属性详解与实用案例
UnityStats 属性详解 UnityStats 是 Unity 引擎提供的一个用于监测游戏性能的工具,它提供了一系列的属性值,可以帮助开发者解游戏的运行情况,从而进行优化.本文将详细介绍 Uni ...
- C#利用Refit实现JWT自动续期
前言 笔者之前开发过一套C/S架构的桌面应用,采用了JWT作为用户的登录认证和授权.遇到的唯一问题就是JWT过期了该怎么办?设想当一个用户正在进行业务操作,突然因为Token过期失效,莫名其妙地跳转到 ...
- [ABC305C] Snuke the Cookie Picker题解
题目大意 有一个 \(H\times W\) 的网格,一种有一个矩形,矩形中间有一个点被挖空,求这个点的坐标.(. 表示空白,# 表示矩形内的点) 解析 观察我们可以发现,每一矩形内的个点上下左右至少 ...