写点什么

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

  • 2023-11-23
    北京
  • 本文字数:6911 字

    阅读完需:约 23 分钟

一、用 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  }然后,我们可以使用递归的方式生成二叉搜索树:
gofunc insertNode(root *Node, key int) *Node { if root == nil { return &Node{Key: key} } if key < root.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 < keys[height-1] {              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 <= 6; 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 < t.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 < i; 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 < 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 <= 21; 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.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 结构体中,我们定义了 keyleftChildrightChild 三个字段,分别表示节点的键、左子节点和右子节点。我们还定义了 IsLeafIsInternalNodeIsExternalNode 三个方法来判断节点的类型。


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 < level; 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.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 ...
复制代码





发布于: 刚刚阅读数: 4
用户头像

公众号:福大大架构师每日一题 2021-02-15 加入

公众号:福大大架构师每日一题

评论

发布
暂无评论
文心一言 VS 讯飞星火 VS chatgpt (141)-- 算法导论12.1 1题_福大大架构师每日一题_福大大架构师每日一题_InfoQ写作社区