三、用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和右子树RightinorderTraversal函数使用一个栈来模拟中序遍历的过程,将根节点入栈,然后循环处理直到栈为空。在每次循环中,将栈顶节点弹出,如果该节点有左子树,则将左子树入栈,如果该节点有右子树,则将右子树入栈,最后将该节点的值加入到结果数组中。最后返回结果数组。

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题的更多相关文章

  1. 【对比】文心一言对飚ChatGPT实操对比体验

    前言 缘由 百度[文心一言]体验申请通过 本狗中午干饭时,天降短信,告知可以体验文心一言,苦等一个月的实操终于到来.心中这好奇的对比心理油然而生,到底是老美的[ChatGPT]厉害,还是咱度娘的[文心 ...

  2. 【个人首测】百度文心一言 VS ChatGPT GPT-4

    昨天我写了一篇文章GPT-4牛是牛,但这几天先别急,文中我测试了用GPT-4回答ChatGPT 3.5 和 Notion AI的问题,大家期待的图片输入也没有出现. 昨天下午百度发布了文心一言,对标C ...

  3. 文心一言,通营销之学,成一家之言,百度人工智能AI大数据模型文心一言Python3.10接入

    "文心"取自<文心雕龙>一书的开篇,作者刘勰在书中引述了一个古代典故:春秋时期,鲁国有一位名叫孔文子的大夫,他在学问上非常有造诣,但是他的儿子却不学无术,孔文子非常痛心 ...

  4. 获取了文心一言的内测及与其ChatGPT、GPT-4 对比结果

    百度在3月16日召开了关于文心一言(知识增强大语言模型)的发布会,但是会上并没现场展示demo.如果要测试的文心一言 也要获取邀请码,才能进行测试的. 我这边通过预约得到了邀请码,大概是在3月17日晚 ...

  5. 百度生成式AI产品文心一言邀你体验AI创作新奇迹:百度CEO李彦宏详细透露三大产业将会带来机遇(文末附文心一言个人用户体验测试邀请码获取方法,亲测有效)

    目录 中国版ChatGPT上线发布 强大中文理解能力 智能文学创作.商业文案创作 图片.视频智能生成 中国生成式AI三大产业机会 新型云计算公司 行业模型精调公司 应用服务提供商 总结 获取文心一言邀 ...

  6. 阿里版ChatGPT:通义千问pk文心一言

    随着 ChatGPT 热潮卷起来,百度发布了文心一言.Google 发布了 Bard,「阿里云」官方终于也宣布了,旗下的 AI 大模型"通义千问"正式开启测试! 申请地址:http ...

  7. 基于讯飞语音API应用开发之——离线词典构建

    最近实习在做一个跟语音相关的项目,就在度娘上搜索了很多关于语音的API,顺藤摸瓜找到了科大讯飞,虽然度娘自家也有语音识别.语义理解这块,但感觉应该不是很好用,毕竟之前用过百度地图的API,有问题也找不 ...

  8. android用讯飞实现TTS语音合成 实现中文版

    Android系统从1.6版本开始就支持TTS(Text-To-Speech),即语音合成.但是android系统默认的TTS引擎:Pic TTS不支持中文.所以我们得安装自己的TTS引擎和语音包. ...

  9. android讯飞语音开发常遇到的问题

    场景:android项目中共使用了3个语音组件:在线语音听写.离线语音合成.离线语音识别 11208:遇到这个错误,授权应用失败,先检查装机量(3台测试权限),以及appid的申请时间(35天期限), ...

  10. 初探机器学习之使用讯飞TTS服务实现在线语音合成

    最近在调研使用各个云平台提供的AI服务,有个语音合成的需求因此就使用了一下科大讯飞的TTS服务,也用.NET Core写了一个小示例,下面就是这个小示例及其相关背景知识的介绍. 一.什么是语音合成(T ...

随机推荐

  1. python教程 入门学习笔记 第2天 第一个python程序 代码规范 用默认的IDLE (Python GUI)编辑器编写

    四.第一个python程序 1.用默认的IDLE (Python GUI)编辑器编写 2.在新建文件中写代码,在初始窗口中编译运行 3.写完后保存为以.py扩展名的文件 4.按F5键执行,在初始窗口观 ...

  2. asp.net core之EfCore

    EF Core(Entity Framework Core)是一个轻量级.跨平台的对象关系映射(ORM)框架,用于在.NET应用程序中访问和操作数据库.它是Entity Framework的下一代版本 ...

  3. 质效提升 | QA不做业务需求测试,你怎么看?

    ​因为有的小伙伴看到公司的QA不测试业务需求,只搞流程.卡点.规范.技术创新.QA平台,行业洞察,让研发自测.研发担责上线bug和风险,所以问我,你怎么看QA不做业务需求测试这件事.其实我怎么看不重要 ...

  4. ATtiny88初体验(二):呼吸灯

    ATtiny88初体验(二):呼吸灯 前面的"点灯"实验实现了间隔点亮/熄灭LED,但是间隔时间和亮度都没法控制,为了解决这个问题,可以使用ATtiny88的定时器模块. ATti ...

  5. 使用 docker 打包构建部署 Vue 项目,一劳永逸解决node-sass安装问题

    文章源于 Jenkins 构建 Vue 项目失败,然后就把 node_modules 删了重新构建发现 node-sass 安装不上了,折腾一天终于可以稳定构建了. 犹记得从学 node 的第一天,就 ...

  6. 《Kali渗透基础》03. 被动信息收集

    @ 目录 1:被动信息收集 1.1:收集内容 1.2:信息用途 2:域名信息收集 2.1:nslookup 2.1.1:命令参数 2.1.2:示例 - 命令行 2.1.3:示例 - 交互式 2.2:d ...

  7. 使用flask开发web应用

    Flask环境搭建 要开发flash应用,我们需要做一些准备工作 我写了个初始化的脚本 Pip_init.sh来安装初始工作 可以到我的git上去下载该脚本进行初始化安装 要启动flask应用,我们需 ...

  8. 大企业才用的分布式唯一Id,它比GUID好

    支持.Net Core(2.0及以上)与.Net Framework(4.5及以上) 可以部署在Docker, Windows, Linux, Mac. 分布式唯一Id,顾名思义,是指在全世界任何一台 ...

  9. Nginx map 实现时间格式转换

    哈喽大家好,我是咸鱼 最近我们需要把 Nginx 的日志接入到自研的日志采集平台上,但是这个平台只支持 JSON 格式,所以需要把 Nginx 日志格式改成 JSON 格式 例如下面这样的效果 刚开始 ...

  10. 【matplotlib基础】--动画

    matplotlib的动画一直是一个强大但使用频率不高的功能,究其原因,一方面展示动画需要一定的媒介,没有图形和文字展示方便:二来大家更关心的是分析结果的最终图表,图表的动态展示则没有那么重要. 不过 ...