首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

文心一言 VS 讯飞星火 VS chatgpt (141)-- 算法导论12.1 1题

一、用go语言,对于关键字集合(1,4,5,10,16,17,21),分别画出高度为 2、3、4、5和6的二又搜索树。

文心一言:

以下是用Go语言为给定的关键字集合(1, 4, 5, 10, 16, 17, 21)生成的高度为2、3、4、5和6的二叉搜索树。

由于二叉搜索树的形状对于不同的生成方式可能会有所不同,所以我这里给出的是一种可能的形状。为了方便展示,我将节点按照从上到下、从左到右的顺序进行排列。

首先,定义一个二叉树节点的结构:

type Node struct {

Key   int

Left  *Node

Right *Node

}

然后,我们可以使用递归的方式生成二叉搜索树:

go

func insertNode(root *Node, key int) *Node {

if root == nil {

return &Node{Key: key}

}

if key 

root.Left = insertNode(root.Left, key)

} else if key > root.Key {

root.Right = insertNode(root.Right, key)

}

return root

}

接下来,我们可以使用给定的关键字集合,生成不同高度的二叉搜索树:

func generateBinarySearchTree(keys []int, height int) *Node {

if height == 1 {

return insertNode(nil, keys[0])

}

leftKeys := make([]int, 0)

rightKeys := make([]int, 0)

for _, key := range keys {

if key 

leftKeys = append(leftKeys, key)

} else {

rightKeys = append(rightKeys, key)

}

}

root := &Node{Key: keys[height-1]}

root.Left = generateBinarySearchTree(leftKeys, height-1)

root.Right = generateBinarySearchTree(rightKeys, height-1)

return root

}

最后,我们可以调用 generateBinarySearchTree 函数生成不同高度的二叉搜索树:

func main() {

keys := []int{1, 4, 5, 10, 16, 17, 21}

trees := make([]*Node, 6)

for i := 2; i 

trees[i-2] = generateBinarySearchTree(keys, i)

}

}

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述讯飞星火,代码正常运行:

首先,我们需要定义一个二叉搜索树的结构体,然后实现插入和遍历的方法。接下来,我们将使用给定的关键字集合创建不同的二又搜索树,并绘制它们的高度为2、3、4、5和6的情况。

解析:

1.定义二叉搜索树结构体

2.实现插入方法

3.实现遍历方法

4.根据给定的关键字集合创建二又搜索树

5.绘制二又搜索树的高度为2、3、4、5和6的情况

代码如下:

package main

import (

"fmt"

)

type TreeNode struct {

Key   int

Left  *TreeNode

Right *TreeNode

}

func NewTreeNode(key int) *TreeNode {

return &TreeNode{Key: key}

}

func (t *TreeNode) Insert(key int) {

if key 

if t.Left == nil {

t.Left = NewTreeNode(key)

} else {

t.Left.Insert(key)

}

} else if key > t.Key {

if t.Right == nil {

t.Right = NewTreeNode(key)

} else {

t.Right.Insert(key)

}

}

}

func (t *TreeNode) InOrderTraversal() []int {

var result []int

if t.Left != nil {

result = append(result, t.Left.InOrderTraversal()...)

}

result = append(result, t.Key)

if t.Right != nil {

result = append(result, t.Right.InOrderTraversal()...)

}

return result

}

func main() {

keywords := []int{1, 4, 5, 10, 16, 17, 21}

trees := make([]*TreeNode, len(keywords))

for i, key := range keywords {

trees[i] = NewTreeNode(key)

for j := 0; j 

trees[i].Insert(keywords[j])

}

}

for i, tree := range trees {

fmt.Printf("Height %d: %v

", i+2, tree.InOrderTraversal())

}

}

运行上述代码,将输出不同高度的二又搜索树的中序遍历结果。

在这里插入图片描述

在这里插入图片描述在这里插入图片描述360智脑,代码不能运行:

抱歉,我无法直接绘制图形。但是,我可以向您解释如何在Go中实现一个二叉搜索树并插入给定的关键字集合。

以下是一个使用Go语言实现的二叉搜索树的示例代码:

package main

import (

"fmt"

)

type Node struct {

Value int

left *Node

right *Node

}

func CreateNode(value int) *Node {

return &Node{value, nil, nil}

}

func InOrder(node *Node) {

if node != nil {

InOrder(node.Left)

fmt.Println(node.Value)

InOrder(node.Right)

}

}

func Insert(node *Node, value int) bool {

if node == nil {

node = CreateNode(value)

return true

}

var parent *Node = nil

var cur *Node = node

for cur != nil {

if cur.Value 

parent = cur

cur = cur.Left

} else if cur.Value > value {

parent = cur

cur = cur.Right

} else {

return false

}

}

parent.Value = value

InOrder(node)

return true

}

func main() {

nodes := []Node{}

for i := 1; i 

nodes = append(nodes, CreateNode(i))

}

fmt.Println("Nodes:", nodes)

for i, node := range nodes {

fmt.Printf("Node %d: %v\n", i, node)

Insert(node, 4)

Insert(node, 5)

Insert(node, 10)

Insert(node, 16)

Insert(node, 17)

Insert(node, 21)

}

}

该代码首先创建了一个空的二叉搜索树,然后通过插入节点来填充它。对于给定关键字集合,可以调用Insert方法将其插入树中。最后,使用main方法遍历整个树并打印每个节点。

要绘制高度为2、3、4、5和6的二叉搜索树,您需要根据树的结构手动创建节点,然后使用图形化工具将它们绘制出来。由于树的高度不同,因此您需要对每个节点进行适当的调整以使其在视觉上看起来平衡。

在这里插入图片描述

在这里插入图片描述在这里插入图片描述智谱清言:

以下是使用Go语言编写的代码,用于构建高度为2、3、4、5和6的二叉搜索树。首先,我们定义了一个结构体来表示节点:

type Node struct {

Key   int

Left  *Node

Right *Node

}

接下来,我们分别创建高度为2、3、4、5和6的二叉搜索树:

func BuildTree(height int) *Node {

if height == 1 {

return &Node{Key: 1}

}

root := &Node{Key: 1}

root.Left = BuildTree(height-1)

root.Right = BuildTree(height-1)

return root

}

func buildHeightTwoTree() *Node {

root := &Node{Key: 1}

root.Left = &Node{Key: 4}

root.Right = &Node{Key: 5}

root.Left.Left = &Node{Key: 1}

root.Left.Right = &Node{Key: 3}

root.Right.Right = &Node{Key: 6}

return root

}

func buildHeightThreeTree() *Node {

root := &Node{Key: 1}

root.Left = &Node{Key: 4}

root.Right = &Node{Key: 5}

root.Left.Left = &Node{Key: 1}

root.Left.Right = &Node{Key: 3}

root.Right.Right = &Node{Key: 6}

root.Left.Left.Left = &Node{Key: 2}

root.Left.Left.Right = &Node{Key: 3}

return root

}

func buildHeightFourTree() *Node {

root := &Node{Key: 1}

root.Left = &Node{Key: 4}

root.Right = &Node{Key: 5}

root.Left.Left = &Node{Key: 1}

root.Left.Right = &Node{Key: 3}

root.Right.Right = &Node{Key: 6}

root.Left.Left.Left = &Node{Key: 2}

root.Left.Left.Right = &Node{Key: 3}

root.Right.Left = &Node{Key: 7}

root.Right.Left.Right = &Node{Key: 8}

return root

}

func buildHeightFiveTree() *Node {

root := &Node{Key: 1}

root.Left = &Node{Key: 4}

root.Right = &Node{Key: 5}

root.Left.Left = &Node{Key: 1}

root.Left.Right = &Node{Key: 3}

root.Right.Right = &Node{Key: 6}

root.Left.Left.Left = &Node{Key: 2}

root.Left.Left.Right = &Node{Key: 3}

root.Right.Left = &Node{Key: 7}

root.Right.Left.Right = &Node{Key: 8}

root.Right.Left.Left = &Node{Key: 9}

return root

}

func buildHeightSixTree() *Node {

root := &Node{Key: 1}

root.Left = &Node{Key: 4}

root.Right = &Node{Key: 5}

root.Left.Left = &Node{Key: 1}

root.Left.Right = &Node{Key: 3}

root.Right.Right = &Node{Key: 6}

root.Left.Left.Left = &Node{Key: 2}

root.Left.Left.Right = &Node{Key: 3}

root.Right.Left = &Node{Key: 7}

root.Right.Left.Right = &Node{Key: 8}

root.Right.Left.Left = &Node{Key: 9}

root.Right.Left.Left.Left = &Node{Key: 10}

root.Right.Left.Left.Right = &Node{Key: 11}

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述通义千问:

很抱歉,我无法直接在这里为你画出二叉搜索树,但我可以告诉你如何使用Go语言来创建这样的树。

首先,在Go中没有内建的数据结构可以直接用来创建一个二叉搜索树(BST)。但你可以自己定义一个数据结构来实现它。一个简单的BST节点可能如下所示:

type Node struct {

Val int

Left *Node

Right *Node

}

然后你需要定义一些方法来插入元素到这个树中,并保持其二叉搜索树的特性。例如,一个基本的插入函数可能如下所示:

func insert(root **Node, val int) {

if *root == nil {

*root = &Node{Val: val}

} else if (*root).Val > val {

insert(&(*root).Left, val)

} else {

insert(&(*root).Right, val)

}

}

有了这些基础,你现在可以创建一个根为空的新树,然后使用上述插入函数将给定的关键字添加到树中。为了确保得到不同高度的树,你可以根据需要调整插入顺序。

注意,不同的插入顺序可能导致生成不同的树,即使它们具有相同的高度。这是因为二叉搜索树是动态查找树,它们的形状取决于输入的数据分布。

在这里插入图片描述天工,代码不能运行:

以下是用Go语言绘制高度为2、3、4、5和6的二叉搜索树的示例代码:

package main

import (

"fmt"

"strconv"

)

type Node struct {

key       int

leftChild *Node

rightChild *Node

}

func NewNode(key int) *Node {

return &Node{

key: key,

}

}

func (n *Node) IsLeaf() bool {

return n.leftChild == nil && n.rightChild == nil

}

func (n *Node) IsInternalNode() bool {

return n.leftChild != nil || n.rightChild != nil

}

func (n *Node) IsExternalNode() bool {

return n.leftChild == nil && n.rightChild == nil

}

func (n *Node) Height() int {

if n == nil {

return 0

}

if n.leftChild == nil && n.rightChild == nil {

return 1

}

if n.leftChild == nil {

return n.rightChild.Height() + 1

}

if n.rightChild == nil {

return n.leftChild.Height() + 1

}

return max(n.leftChild.Height(), n.rightChild.Height()) + 1

}

func (n *Node) String() string {

if n == nil {

return ""

}

if n.IsLeaf() {

return fmt.Sprintf("%d", n.key)

}

return fmt.Sprintf("(%s %s %s)", n.leftChild.String(), strconv.Itoa(n.key), n.rightChild.String())

}

func max(a, b int) int {

if a > b {

return a

}

return b

}

func main() {

keys := []int{1, 4, 5, 10, 16, 17, 21}

root := NewNode(0)

for _, key := range keys {

root.Insert(key)

}

root.PrintTree()

}

func (root *Node) Insert(key int) {

if root == NULL {

root = NewNode(key)

return

}

if key 

root.leftChild = root.leftChild.Insert(key)

} else if key > root.key {

root.rightChild = root.rightChild.Insert(key)

} else {

fmt.Printf("Duplicate key: %d\n", key)

}

}

func (node *Node) PrintTree() {

if node == nil {

return

}

fmt.Printf("%s\n", node.String())

if node.leftChild != nil {

node.leftChild.PrintTree()

}

if node.rightChild != nil {

node.rightChild.PrintTree()

}

}

func max(a, b int) int {

if a > b {

return a

}

return b

}

该代码使用二叉搜索树来存储关键字集合,并使用递归方式打印出树形结构。在main函数中,我们先定义关键字集合,然后创建一个根节点,并使用Insert方法将所有关键字插入到树中。最后,我们调用PrintTree方法打印树形结构。

在Node结构体中,我们定义了key、leftChild和rightChild三个字段,分别表示节点的键、左子节点和右子节点。我们还定义了IsLeaf、IsInternalNode和IsExternalNode三个方法来判断节点的类型。

在Node结构体中,我们还定义了Height方法来计算节点的高度。在PrintTree方法中,我们首先打印节点的字符串表示,然后递归地打印左子树和右子树。

在main函数中,我们首先创建一个根节点,并使用Insert方法将所有关键字插入到树中。最后,我们调用PrintTree方法打印树形结构。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述灵小智,代码正常运行:

好的,我可以帮你用Go语言画出指定高度的二叉搜索树。下面是使用递归方式实现的代码示例:

package main

import (

"fmt"

)

type Node struct {

Value int

Left  *Node

Right *Node

}

func main() {

keywords := []int{1, 4, 5, 10, 16, 17, 21}

heights := []int{2, 3, 4, 5, 6}

for _, height := range heights {

root := constructBST(keywords, 0, len(keywords)-1, height)

fmt.Printf("Height: %d\n", height)

printTree(root, 0)

fmt.Println()

}

}

func constructBST(keywords []int, start, end, height int) *Node {

if start > end || height == 0 {

return nil

}

mid := (start + end) / 2

root := &Node{Value: keywords[mid]}

leftHeight := height - 1

rightHeight := height - 1

if mid-start >= end-mid {

leftHeight++

} else {

rightHeight++

}

root.Left = constructBST(keywords, start, mid-1, leftHeight)

root.Right = constructBST(keywords, mid+1, end, rightHeight)

return root

}

func printTree(node *Node, level int) {

if node == nil {

return

}

printTree(node.Right, level+1)

for i := 0; i 

fmt.Printf("\t")

}

fmt.Println(node.Value)

printTree(node.Left, level+1)

}

这段代码可以根据给定的关键字集合和高度构造相应的二叉搜索树,并打印出来。你可以根据需要修改关键字集合和高度来生成不同的树形结构。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述chatgpt,代码正常运行:

下面是使用Go语言实现的绘制不同高度二叉搜索树的示例代码:

package main

import (

"fmt"

"strings"

)

type Node struct {

Value int

Left  *Node

Right *Node

}

func NewNode(value int) *Node {

return &Node{

Value: value,

}

}

func Insert(root *Node, value int) *Node {

if root == nil {

return NewNode(value)

}

if value 

root.Left = Insert(root.Left, value)

} else if value > root.Value {

root.Right = Insert(root.Right, value)

}

return root

}

func PrintTree(root *Node, space int) {

const spaceCount = 4

if root == nil {

return

}

space += spaceCount

PrintTree(root.Right, space)

fmt.Println(strings.Repeat(" ", space-spaceCount), root.Value)

PrintTree(root.Left, space)

}

func main() {

keywords := []int{1, 4, 5, 10, 16, 17, 21}

heights := []int{2, 3, 4, 5, 6}

for _, height := range heights {

var root *Node

for _, keyword := range keywords {

root = Insert(root, keyword)

if height > 0 && height != calculateHeight(root) { // 如果指定了非零高度,并且当前高度不匹配,继续插入节点直到达到目标高度

continue

}

fmt.Printf("Height: %d\n", calculateHeight(root))

PrintTree(root, 0)

fmt.Println()

}

fmt.Println("----------------------------------")

}

}

func calculateHeight(node *Node) int {

if node == nil {

return 0

}

leftHeight := calculateHeight(node.Left)

rightHeight := calculateHeight(node.Right)

if leftHeight > rightHeight {

return leftHeight + 1

} else {

return rightHeight + 1

}

}

运行该代码,可以输出不同高度的二叉搜索树:

Height: 2

21

17

16

21

17

16

21

17

16

21

17

16

21

17

16

Height:3

...

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

  • 发表于:
  • 原文链接https://page.om.qq.com/page/OAk8cJ2hUQvE-oHgLd00DYew0
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

相关快讯

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券