文心一言 VS 讯飞星火 VS chatgpt (143)-- 算法导论12.1 3题
三、用go语言,设计一个执行中序遍历的非递归算法。(提示:一种容易的方法是使用栈作为辅助数据结构;另一种较复杂但比较简洁的做法是不使用栈,但要假设能测试两个指针是否相等。)
文心一言,代码正常运行:
我们可以使用栈作为辅助数据结构来执行中序遍历的非递归算法。以下是用Go语言实现的代码:
package main
import (
"fmt"
)
type TreeNode struct {
Val int
Left *TreeNode
Right *TreeNode
}
func inorderTraversal(root *TreeNode) {
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}
inorderTraversal(root)
}
这个程序定义了一个TreeNode结构体,每个节点有一个整数值和两个指向其左右子节点的指针。inorderTraversal函数接收一个树的根节点,并使用栈来进行中序遍历。在遍历过程中,首先将当前节点及其所有左子节点推入栈中,然后处理栈顶节点(即最深层的左子节点),打印其值并将节点从栈中弹出。然后转向处理该节点的右子节点。如果在任何时候栈为空且当前节点为nil,则遍历结束。
讯飞星火,代码正常运行:
package main
import "fmt"
type TreeNode struct {
Val int
Left *TreeNode
Right *TreeNode
}
func inorderTraversal(root *TreeNode) []int {
stack := []*TreeNode{}
curr := root
var res []int
for curr != nil || len(stack) > 0 {
for curr != nil {
stack = append(stack, curr)
curr = curr.Left
}
curr = stack[len(stack)-1]
stack = stack[:len(stack)-1]
res = append(res, curr.Val)
curr = curr.Right
}
return res
}
func main() {
root := &TreeNode{Val: 1}
root.Right = &TreeNode{Val: 2}
root.Right.Left = &TreeNode{Val: 3}
fmt.Println(inorderTraversal(root)) // Output: [1 3 2]
}
360智脑,代码不能运行:
使用栈实现中序遍历的非递归算法:
package main
import (
"fmt"
)
// BinaryTree is a simple implementation of binary tree node.
type BinaryTree struct {
Data interface{}
Left *BinaryTree
Right *BinaryTree
}
// InOrderNoRecursion is an implementation of in-order traversal without recursion.
func (bt *BinaryTree) InOrderNoRecursion() []interface{} {
res := []interface{}{}
stack := []interface{}{bt}
for len(stack) > 0 {
for bt != nil {
stack = stack[1:]
stack = stack[0:1]
bt = bt.Left
}
if len(stack) == 0 {
break
}
var current interface{}
for _, element := range stack {
current = element
}
res = append(res, current.(interface{})) // visit current node
stack = stack[1:]
bt = bt.Right
}
return res
}
func init() {
// Create an empty binary tree.
root := &BinaryTree{}
root.Left = &BinaryTree{}
root.Right = &BinaryTree{}
// Create an empty binary tree for testing.
testRoot := &BinaryTree{}
testRoot.Left = &BinaryTree{}
testRoot.Right = &BinaryTree{}
fmt.Println("In-order traversal without recursion result:", InOrderNoRecursion(root))
fmt.Println("In-order traversal without recursion result:", InOrderNoRecursion(testRoot))
}
该代码首先创建了一个空二叉树,然后创建两个测试用的二叉树进行测试。在InOrderNoRecursion()
方法中,我们使用了栈来模拟中序遍历的过程。每次遍历到一个节点时,将其加入栈中,然后移动到其左子树或右子树。当栈为空时,表示已经遍历完所有节点,此时返回结果数组即可。
智谱清言,第1段代码正常运行,第2段代码抛panic:
以下是使用栈作为辅助数据结构的非递归算法实现:
package main
import "fmt"
type TreeNode struct {
Val int
Left *TreeNode
Right *TreeNode
}
func inorderTraversal(root *TreeNode) []int {
if root == nil {
return []int{}
}
result := make([]int, 0)
stack := make([]*TreeNode, 0)
current := root
for current != nil || len(stack) > 0 {
for current != nil {
stack = append(stack, current)
current = current.Left
}
current = stack[len(stack)-1]
stack = stack[:len(stack)-1]
result = append(result, current.Val)
current = current.Right
}
return result
}
func main() {
root := &TreeNode{Val: 1, Left: &TreeNode{Val: 2, Left: &TreeNode{Val: 3, Left: nil, Right: nil}, Right: nil}, Right: &TreeNode{Val: 4, Left: nil, Right: nil}}
fmt.Println(inorderTraversal(root)) // 输出:[3 2 4 1]
}
以下是使用非递归但假设能测试两个指针是否相等的做法:
package main
import "fmt"
type TreeNode struct {
Val int
Left *TreeNode
Right *TreeNode
}
func isEqual(a, b *TreeNode) bool {
if a == nil && b == nil {
return true
}
if a == nil || b == nil {
return false
}
return a.Val == b.Val && isEqual(a.Left, b.Left) && isEqual(a.Right, b.Right)
}
func inorderTraversal(root *TreeNode) []int {
if root == nil {
return []int{}
}
result := make([]int, 0)
current := root
for current != nil {
for isEqual(current.Left, current) {
current = current.Left
}
result = append(result, current.Val)
for !isEqual(current.Right, current) {
current = current.Right
}
current = current.Right
}
return result
}
func main() {
root := &TreeNode{Val: 1, Left: &TreeNode{Val: 2, Left: &TreeNode{Val: 3, Left: nil, Right: nil}, Right: nil}, Right: &TreeNode{Val: 4, Left: nil, Right: nil}}
fmt.Println(inorderTraversal(root)) // 输出:[3 2 4 1]
}
这两种方法都可以实现中序遍历,但第二种方法不使用栈,而是假设能测试两个指针是否相等,这种假设在实际编程中可能不总是成立,因此第一种方法更为推荐。
通义千问,两段代码都能正常运行:
以下是两种方法实现的Go语言代码:
方法一:使用栈作为辅助数据结构
package main
import (
"fmt"
)
type TreeNode struct {
Val int
Left *TreeNode
Right *TreeNode
}
func inorderTraversal(root *TreeNode) []int {
var res []int
if root == nil {
return res
}
stack := []*TreeNode{}
for node := root; 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]
res = append(res, node.Val)
node = node.Right
}
return res
}
func main() {
root := &TreeNode{Val: 1}
root.Left = &TreeNode{Val: 2}
root.Right = &TreeNode{Val: 3}
fmt.Println(inorderTraversal(root)) // 输出: [2 1 3]
}
方法二:不使用栈,测试两个指针是否相等
package main
import (
"fmt"
)
type TreeNode struct {
Val int
Left *TreeNode
Right *TreeNode
}
func inorderTraversal(root *TreeNode) []int {
var res []int
if root == nil {
return res
}
cur := root
for cur != nil {
if cur.Left != nil {
tmp := cur.Left
for tmp.Right != nil && tmp.Right != cur {
tmp = tmp.Right
}
if tmp.Right == nil {
tmp.Right = cur
cur = cur.Left
continue
} else {
tmp.Right = nil
}
}
res = append(res, cur.Val)
cur = cur.Right
}
return res
}
func main() {
root := &TreeNode{Val: 1}
root.Left = &TreeNode{Val: 2}
root.Right = &TreeNode{Val: 3}
fmt.Println(inorderTraversal(root)) // 输出: [2 1 3]
}
这两种方法都可以有效地对二叉树进行中序遍历,并且都不会修改原始的二叉树结构。
天工,代码正常运行:
以下是使用栈实现中序遍历的非递归算法的Go代码示例:
package main
import "fmt"
type TreeNode struct {
Val int
Left *TreeNode
Right *TreeNode
}
func inorderTraversal(root *TreeNode) []int {
res := []int{}
stack := []*TreeNode{root}
for len(stack) > 0 {
node := stack[len(stack)-1]
stack = stack[:len(stack)-1]
if node.Left != nil {
stack = append(stack, node.Left)
}
if node.Right != nil {
stack = append(stack, node.Right)
}
res = append(res, node.Val)
}
return res
}
func main() {
root := &TreeNode{1, &TreeNode{2, nil, nil}, &TreeNode{3, nil, nil}}
res := inorderTraversal(root)
fmt.Println(res) // Output: [2 1 3]
}
该代码定义了一个TreeNode
结构体,表示二叉树的节点,包含节点的值Val
,左子树Left
和右子树Right
。inorderTraversal
函数使用一个栈来模拟中序遍历的过程,将根节点入栈,然后循环处理直到栈为空。在每次循环中,将栈顶节点弹出,如果该节点有左子树,则将左子树入栈,如果该节点有右子树,则将右子树入栈,最后将该节点的值加入到结果数组中。最后返回结果数组。
在main
函数中,创建了一个二叉树的根节点,并调用inorderTraversal
函数对其进行中序遍历,并将结果打印到控制台上。输出结果为[2 1 3]
,与预期结果一致。
灵小智:
以下是使用栈作为辅助数据结构的非递归算法,用于执行中序遍历:
// 树节点定义
type TreeNode struct {
Val int
Left *TreeNode
Right *TreeNode
}
// 中序遍历函数
func inorderTraversal(root *TreeNode) []int {
if root == nil {
return nil
}
stack := []*TreeNode{}
result := []int{}
currentNode := root
for currentNode != nil || len(stack) > {
// 将当前节点及其所有左子节点入栈
for currentNode != nil {
stack = append(stack, currentNode)
currentNode = currentNode.Left
}
// 弹出栈顶节点并记录其值
currentNode = stack[len(stack)-1]
stack = stack[:len(stack)-1]
result = append(result, currentNode.Val)
// 处理右子节点
currentNode = currentNode.Right
}
return result
}
这个算法使用了一个栈来存储待处理的节点。首先将根节点及其所有左子节点依次入栈,然后弹出栈顶节点并记录其值,最后处理右子节点。重复这个过程直到栈为空且当前节点为空。
使用这个算法可以实现中序遍历的非递归方式。希望这个代码对你有帮助!
chatgpt:
下面是使用栈作为辅助数据结构的非递归中序遍历算法的示例代码:
type TreeNode struct {
Val int
Left *TreeNode
Right *TreeNode
}
func inorderTraversal(root *TreeNode) []int {
if root == nil {
return nil
}
stack := []*TreeNode{}
res := []int{}
curr := root
for curr != nil || len(stack) > 0 {
// 将当前节点及其左子树入栈,直到没有左子节点为止
for curr != nil {
stack = append(stack, curr)
curr = curr.Left
}
// 弹出栈顶元素,并将其值添加到结果数组中
top := stack[len(stack)-1]
stack = stack[:len(stack)-1]
res = append(res, top.Val)
// 处理右子树
curr = top.Right
}
return res
}
这个算法使用了一个辅助栈,通过模拟递归过程来实现非递归的中序遍历。具体步骤如下:
1.如果当前节点不为空或者栈不为空,则继续循环。
2.将当前节点以及它的所有左子节点依次入栈,直到当前节点为空。
3.弹出栈顶元素,将其值添加到结果数组中。
4.处理弹出节点的右子节点。
以上是一种常见且简单易懂的方法。另外一种复杂但更简洁的方法是使用 Morris Traversal 算法,它不需要额外的栈空间,但需要对指针进行特殊处理。在此不再赘述。
文心一言 VS 讯飞星火 VS chatgpt (143)-- 算法导论12.1 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 ...
随机推荐
- 关于 ModelScope 的视频 “AI 换脸” 优化方案
前言 前面一文,初步完成了一下 "AI 换脸" 视频处理程序.完成了视频拆帧,拆帧图片人脸融合,已经音频提取和最后的人脸融合图片的整合(也就是将图片和音频组成视频).但是在人脸融合 ...
- 绕过网站CDN查找网站真实ip方法大全(持续更新中)
这是一篇全网(无论国内还是国外)最全.最详细.最新.最实用的关于 CDN 网络对抗攻击的文章,渗透测试中若碰到 CDN 类的问题,只需要看这一篇指南即可.我也会在 Github (https://gi ...
- 牛客小白月赛65 E题 题解
原题链接 题意描述 构造一个\(1\)到\(n\)的排列,使得其中正好有\(k\)个二元组\((i, j)\)满足,\(1\le i\lt j\le n\) && \(a_i - a_ ...
- 一文搞明白STM32芯片存储结构
一.前言 本篇介绍STM32芯片的存储结构,ARM公司负责提供设计内核,而其他外设则为芯片商设计并使用,ARM收取其专利费用而不参与其他经济活动,半导体芯片厂商拿到内核授权后,根据产品需求,添加各类组 ...
- 解决WSL执行systemctl命令报错:Failed to get D-Bus connection
问题描述 笔者通过WSL安装了CentOS7系统,刚开始一切都很顺利.当执行systemctl命令时,却意外报错:Failed to get D-Bus connection: Operation n ...
- Chrome116驱动下载路径 解决版本不匹配问题
更新于 2023-08-23 后续可能会有同步,就不会引发该问题 要看解决可以直接看最后的总结 背景 执行selenium代码报错 from selenium import webdriver dri ...
- 在Windows下用VScode构造shell脚本的IDE
在linux系统中,大家可以很轻松的开发.调试shell脚本.但是,对于不熟悉linux系统 的小白或者想在Windows下开发shell脚本的人来说,这就有点不友好了.本篇文章就 教大家,在Wind ...
- Linux 主机磁盘繁忙度监控实战shell脚本
Linux 磁盘繁忙度是指磁盘的使用率和活动水平.可以通过一些工具来监测磁盘繁忙度,如 iostat.iotop.sar 等. 其中,iostat 是一个常用的工具,可以提供关于磁盘活动的详细统计信息 ...
- 简化车辆登记流程:利用腾讯云OCR实现自动化信息识别
项目中有一块,需要用到上传车牌车牌号到系统里,用了下腾讯云的ocr车牌号识别做了个小功能.通过腾讯云的orc识别,将车牌号录入到后台. 一,首先我们需要登录到腾讯云,然后搜索一下orc或者车牌号 ...
- 使用docker搭建seafile服务器
工作需要在单位和家里的不同电脑上同步指定文件夹及其内容.对比了一些解决方案,最终还是选择熟悉的seafile来做. 需要按照官方文档进行seafile的安装,选择官方推荐的docker方式快速部署. ...