Go 语言二叉树层序遍历程序


在编程中,有多种数据结构用于存储数据。数据结构主要分为线性结构和非线性结构两种。数组、栈、队列和链表是线性数据结构。二叉树、Trie 树等是非线性数据结构。本文将探讨非线性数据结构之一——二叉树的层序遍历。

层序遍历

在二叉树的层序遍历中,我们从根节点开始,然后遍历子节点,再依次遍历子节点的子节点。以此类推,直到遍历到最后一层,完成层序遍历。为了实现这一点,我们使用广度优先搜索算法,其中使用队列数据结构。

例如,在上图所示的树中

第 1 层:遍历根节点 1

第 2 层:依次遍历节点 2、节点 3 和节点 4。

第 3 层:依次遍历节点 5、节点 6 和节点 7。

算法

步骤 1:导入 "fmt" - 导入 fmt 库

步骤 2:type TreeNode struct { Val int Left *TreeNode Right *TreeNode } - 创建一个树节点的结构体,其中包含一个整数类型的 Val 用于存储节点数据,以及两个 TreeNode 类型的指针 Left 和 Right。

步骤 3:开始主函数

  • root : = TreeNode{0, nil, nil} - 创建一个变量 root,表示树的根节点,类型为 TreeNode。

  • 调用函数 CreateBinaryTree(&root) 创建完整的二叉树。

  • levelOrder : = LevelOrderTraversal(&root) - 调用函数 LevelOrderTraversal 执行层序遍历,并将根节点的引用作为参数传递。

  • 打印层序遍历函数返回的数组。

步骤 4:层序遍历函数。

  • func LevelOrderTraversal(root *TreeNode) []int {} - 声明一个函数,TreeNode 类型的变量作为参数,返回一个整数数组。

  • if root == nil { return []int{} } - 检查根节点是否为空,如果为空则返回一个空数组。

  • var q Queue - 创建一个队列,用于实现广度优先搜索算法。

  • var levelOrder []int - 创建一个数组,用于在层序遍历过程中存储节点的值。

  • 应用广度优先搜索算法,最后返回数组。

示例

在此代码中,我们实现了队列数据结构及其函数,因为目前 Go 语言中没有预构建的队列库。

package main

import "fmt"

type Queue struct {
    List [](*TreeNode)
}

type TreeNode struct {
    Val   int
    Left  *TreeNode
    Right *TreeNode
}

// function to add an element in the queue
func (q *Queue) Enqueue(element *TreeNode) {
    q.List = append(q.List, element)
}

// function to delete elements in the queue
func (q *Queue) Dequeue() *TreeNode {
    if q.isEmpty() {
        fmt.Println("Queue is empty.")
        return nil
    }
    element := q.List[0]
    q.List = q.List[1:]

    return element
}

// function checks that queue is empty or not
func (q *Queue) isEmpty() bool {
    return len(q.List) == 0
}

// function to find the length of the queue
func (q *Queue) size() int {
    return len(q.List)
}

// creating binary tree
func CreateBinaryTree(root *TreeNode) {
    n1 := TreeNode{1, nil, nil}
    n2 := TreeNode{2, nil, nil}
    root.Left = &n1
    root.Right = &n2

    n3 := TreeNode{3, nil, nil}
    n4 := TreeNode{4, nil, nil}
    n1.Left = &n3
    n1.Right = &n4

    n5 := TreeNode{5, nil, nil}
    n6 := TreeNode{6, nil, nil}
    n2.Left = &n5
    n2.Right = &n6
}

// level order traversal of a function with root node as argument
// and returns the right-view elements in the array
func LevelOrderTraversal(root *TreeNode) []int {
    // returning empty array if the tree is empty
    if root == nil {
        return []int{}
    }

    // creating variable for queue
    var q Queue

    // creating array to store right side element
    var levelOrder []int

    // enqueue root address in the queue
    q.Enqueue(root)
    q.Enqueue(nil)

    // breadth-first search over the tree
    for q.size() > 1 {
        currNode := q.Dequeue()
        if currNode == nil {
            q.Enqueue(nil)
            levelOrder = append(levelOrder, -1)
            continue
        }
        levelOrder = append(levelOrder, currNode.Val)
        if currNode.Left != nil {
            q.Enqueue(currNode.Left)
        }
        if currNode.Right != nil {
            q.Enqueue(currNode.Right)
        }

    }

    return levelOrder
}

func main() {
    fmt.Println("Golang program to find the level order traversal of a binary tree.")

    // creating root node of binary tree
    root := TreeNode{0, nil, nil}
    // calling CreateBinaryTree function to create a complete binary tree
    CreateBinaryTree(&root)

    // calling LevelOrderTraversal function
    levelOrder := LevelOrderTraversal(&root)

    // print elements of binary tree in level order
    for i := 0; i < len(levelOrder); i++ {
        if levelOrder[i] == -1 {
            fmt.Println()
            continue
        }
        fmt.Print(levelOrder[i], " ")
    }
    fmt.Println()
}

输出

Golang program to find the level order traversal of a binary tree.
0 
1 2 
3 4 5 6

结论

通过这种方式,我们使用广度优先搜索算法实现了树的层序遍历。树还有其他遍历算法,例如中序遍历、先序遍历和后序遍历。此方法的时间复杂度为 O(V + E),其中 V 和 E 分别是图中的顶点数和边数。我们也可以使用深度优先搜索算法来查找树的层序遍历。要了解更多关于 Go 语言的信息,您可以浏览这些 教程

更新于: 2023-07-10

345 次浏览

开启您的 职业生涯

完成课程获得认证

开始学习
广告