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 次瀏覽

開啟您的 職業生涯

完成課程獲得認證

開始學習
廣告
© . All rights reserved.