首页 > 编程语言 >文心一言 VS 讯飞星火 VS chatgpt (122)-- 算法导论10.4 3题

文心一言 VS 讯飞星火 VS chatgpt (122)-- 算法导论10.4 3题

时间:2023-10-30 17:34:23浏览次数:38  
标签:node Right TreeNode 10.4 stack VS 文心 root 节点


三、用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.重复上述步骤,直到栈为空。

文心一言 VS 讯飞星火 VS chatgpt (122)-- 算法导论10.4 3题_1024程序员节

文心一言 VS 讯飞星火 VS chatgpt (122)-- 算法导论10.4 3题_算法_02

讯飞星火:

首先,我们需要定义一个二叉树节点的结构体,然后使用一个栈来辅助遍历二叉树。具体步骤如下:

  1. 初始化一个空栈,将根节点压入栈中。
  2. 当栈不为空时,执行以下操作:
    a. 弹出栈顶元素,输出该元素的关键字。
    b. 如果该元素有右子节点,将右子节点压入栈中。
    c. 如果该元素有左子节点,将左子节点压入栈中。
  3. 重复步骤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函数进行遍历。

文心一言 VS 讯飞星火 VS chatgpt (122)-- 算法导论10.4 3题_chatgpt_03

文心一言 VS 讯飞星火 VS chatgpt (122)-- 算法导论10.4 3题_算法_04

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是二叉树中的结点数,因为它只遍历了树的深度,而没有进行任何嵌套遍历。

文心一言 VS 讯飞星火 VS chatgpt (122)-- 算法导论10.4 3题_chatgpt_05

文心一言 VS 讯飞星火 VS chatgpt (122)-- 算法导论10.4 3题_算法_06

智谱清言:

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

文心一言 VS 讯飞星火 VS chatgpt (122)-- 算法导论10.4 3题_算法_07

文心一言 VS 讯飞星火 VS chatgpt (122)-- 算法导论10.4 3题_golang_08

通义千问:

下面是一个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函数获取所有的层序遍历结果,然后逐行打印即可。

文心一言 VS 讯飞星火 VS chatgpt (122)-- 算法导论10.4 3题_入栈_09

文心一言 VS 讯飞星火 VS chatgpt (122)-- 算法导论10.4 3题_算法_10

天工:

以下是使用 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) 时间复杂度内遍历二叉树,并输出每个节点的关键字。

文心一言 VS 讯飞星火 VS chatgpt (122)-- 算法导论10.4 3题_chatgpt_11

文心一言 VS 讯飞星火 VS chatgpt (122)-- 算法导论10.4 3题_golang_12

chatgpt:

可以使用中序遍历的非递归方式来实现输出二叉树每个节点的关键字。具体步骤如下:

  1. 初始化一个空栈和一个指针cur,指向根节点。
  2. 当cur不为空或者栈不为空时,执行以下操作:
  • 将cur指向的节点以及其左子树中的所有节点入栈,并将cur更新为其左子节点。
  • 弹出并打印栈顶元素,即当前遍历到的节点。
  • 将cur更新为当前节点的右子节点。
  1. 重复步骤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题_算法_13

文心一言 VS 讯飞星火 VS chatgpt (122)-- 算法导论10.4 3题_1024程序员节_14


标签:node,Right,TreeNode,10.4,stack,VS,文心,root,节点
From: https://blog.51cto.com/moonfdd/8095783

相关文章

  • 如何使用VSCode创建编辑Markdown文件
    断更了这么久,我回来啦!!!目录如何使用VSCode创建编辑Markdown文件一、安装VSCode软件二、VSCode安装Markdown相关插件1、VSCode安装插件的步骤2、VSCode中与Markdown有关的插件3、插件安装完成后的效果图三、VSCode操作Markdown文件1、VSCode新建Markdown文件2、VSCode编辑Markdow......
  • API VS SDK!
    APIVSSDK!API(应用程序编程接口)和SDK(软件开发工具包)是软件开发领域的重要工具,但它们具有不同的用途:1.应用程序编程接口API是一组规则和协议,允许不同的软件应用程序和服务相互通信。它定义了软件组件如何交互。促进软件组件之间的数据交换和功能访问。通常由端点、请......
  • 借助文心大模型4.0轻松搞定统计报表
    在10月17日的百度世界2023上,文心大模型4.0版本正式发布!会上百度董事长李彦宏为我们展示了文心大模型4.0在多轮对话、搜索、地图、商业智能、智能会议、智能视频等方面的强悍。对此我们保持疑问,那文心大模型4.0真有这么好?我们在第一时间拿到测试资格,并进行了实际实测。对比文心大模......
  • vsCode格式化代码最优解
    1,设置->搜索vetur.format.defaultFormatter.html->选择js-beautify-html2.打开文件首选项设置点击右上角的文档图标随便找个地儿加上这段代码"vetur.format.defaultFormatterOptions":{"js-beautify-html":{"wrap_line_length":120,"wrap_attributes":......
  • 用JVS低代码表单引擎,打造个性化表单
    什么是表单下拉框表单下拉框是一种用户界面元素,通常用于表单中,允许用户从一组预定义的选项中选择一个选项。表单下拉框由一个下拉箭头和一个选项列表组成,用户可以通过点击下拉箭头来展开选项列表,然后选择其中的一个选项。表单下拉框通常用于收集用户的信息,例如选择国家、省份、性别......
  • 文心一言 VS 讯飞星火 VS chatgpt (123)-- 算法导论10.4 4题
    四、用go语言,对于一个含n个结点的任意有根树,写出一个O(n)时间的过程,输出其所有关键字该树以左孩子右兄弟表示法存储。文心一言:在计算机科学中,左孩子右兄弟表示法是一种用于表示树状结构的方法,其中每个节点都有两个指针:一个指向其第一个孩子(左孩子),另一个指向其下一个兄弟(右兄弟......
  • 文心一言 VS 讯飞星火 VS chatgpt (123)-- 算法导论10.4 4题
    四、用go语言,对于一个含n个结点的任意有根树,写出一个O(n)时间的过程,输出其所有关键字该树以左孩子右兄弟表示法存储。文心一言:在计算机科学中,左孩子右兄弟表示法是一种用于表示树状结构的方法,其中每个节点都有两个指针:一个指向其第一个孩子(左孩子),另一个指向其下一个兄弟(右兄弟)。......
  • Markdown基础语法+部分扩语法(vscode)
    mdk语法目录mdk语法基础语法标题语法换行语法段落语法强调语法粗体(Bold)斜体(Italic)粗体和斜体引用语法我给你你出生多年前的列表语法有序列表无序列表在列表中嵌套其他元素代码语法行内代码代码块分割线语法链接语法网址和Email地址带格式话的链接引用类型链接图片语法普通图......
  • 读取一个cvs文件,一行一行输出出来
    importcsvfile='D:\\1.csv'withopen(file,encoding="UTF8")asf: reader=csv.reader(f)#创建读取器 header_row=next(reader)#获取表的第一行(一般是列名) print(header_row)#打印 first_row=next(reader)......
  • 弱符号与强符号 vs 弱引用与强引用
    弱符号与强符号说明对于C/C++语言来说,编译器默认函数和初始化了的全局变量为强符号,未初始化的全局变量为弱符号。我们也可以通过GCC的"__attribute__((weak))"来定义任何一个强符号为弱符号。注意,强符号和弱符号都是针对定义来说的,不是针对符号的引用。比如我们有下面这段程序:......