Golang 用于执行中序遍历二叉树操作

Golang 用于执行中序遍历二叉树操作

在Go编程语言中,树是一种经常使用的数据结构,类似于倒置的树或反向树,节点之间存在父子关系。在树中,每个节点都有一个值和零个或多个后代节点。根节点是没有父节点的节点,而叶子节点是没有子节点的节点。树可以用于各种任务,包括在分层结构中进行数据存储、排序和搜索。我们将使用两种方法执行中序遍历二叉树操作。

语法

func make ([] type, size, capacity)

在Go语言中,make函数用于创建一个数组或映射,它接受要创建的变量类型、尺寸和容量作为参数。

func append(slice, element_1, element_2…, element_N) []T

append函数用于将值添加到数组切片中。它接受多个参数。第一个参数是我们希望添加值的数组,后面是要添加的值。该函数返回包含所有值的最终切片。

步骤

  • 步骤1 - 创建一个主包并在程序中声明fmt(格式化包)和strings包,其中主要产生可执行代码,fmt用于格式化输入和输出。

  • 步骤2 - 为了表示包含值、指向左子节点的指针和指向右子节点的指针的二叉树节点,定义一个TreeNode结构。

  • 步骤3 - 定义一个inorder_traversal函数,该函数接受指向二叉树根节点的指针,并返回一个显示树中序遍历的数字切片。

  • 步骤4 - 如果根节点为nil,则inorder_traversal函数应返回一个空切片。

  • 步骤5 - 如果根节点不为null,则将在左子节点上进行的inorder_traversal调用的结果添加到输出切片中。

  • 步骤6 - 输出切片应包括当前节点的值。

  • 步骤7 - 对右子节点上的inorder_traversal调用的输出进行切片。

  • 步骤8 - 将输出切片返回给函数。

  • 步骤9 - 在主函数中创建一个二叉树,并在根节点上调用inorder_traversal。

  • 步骤10 - 使用fmt.Println()函数在控制台上打印中序遍历的结果,ln表示新行。

示例1

在这个示例中,我们使用递归来执行程序。

package main
import "fmt"

// Definition for a binary tree node
type TreeNode struct {
   Val       int
   Left_val  *TreeNode
   Right_val *TreeNode
}

func inorder_traversal(root *TreeNode) []int {
   output := make([]int, 0)
   if root == nil {
      return output
   }
   output = append(output, inorder_traversal(root.Left_val)...)
   output = append(output, root.Val)
   output = append(output, inorder_traversal(root.Right_val)...)
   return output
}

func main() {
   root := &TreeNode{Val: 10}
   root.Left_val = &TreeNode{Val: 20}
   root.Right_val = &TreeNode{Val: 30}
   root.Left_val.Left_val = &TreeNode{Val: 40}
   root.Left_val.Right_val = &TreeNode{Val: 50}

   output := inorder_traversal(root)
   fmt.Println("The inorder traversal is given as:")
   fmt.Println(output) //print the inorder tree traversal
}

输出

The inorder traversal is given as:
[40 20 50 10 30]

示例2

在这个示例中,我们将使用堆栈来实现中序遍历树。

package main
import "fmt"

// Definition for a binary tree node
type TreeNode struct {
   Val  int
   Left_val  *TreeNode
   Right_val *TreeNode
}

func inorder_traversal(root *TreeNode) []int {
   result := make([]int, 0)
   stack := make([]*TreeNode, 0)
   curr := root

   for curr != nil || len(stack) > 0 {
      for curr != nil {
         stack = append(stack, curr)
         curr = curr.Left_val
      }
      curr = stack[len(stack)-1]
      stack = stack[:len(stack)-1]
      result = append(result, curr.Val)
      curr = curr.Right_val
   }
   return result
}

func main() {
   root := &TreeNode{Val: 10}
   root.Left_val = &TreeNode{Val: 20}
   root.Right_val = &TreeNode{Val: 30}
   root.Left_val.Left_val = &TreeNode{Val: 40}
   root.Left_val.Right_val = &TreeNode{Val: 50}

   result := inorder_traversal(root)
   fmt.Println("The inorder traversal can be represented as:")
   fmt.Println(result)  //print the inorder tree traversal
}

输出

The inorder traversal can be represented as:
[40 20 50 10 30]

结论

我们使用两种方法执行了中序遍历的程序。在第一个示例中,我们使用递归,在第二个示例中我们使用栈。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程