首頁 >後端開發 >Golang >Go 中 Goroutine 和 Channels 如何有效率地比較兩棵二元樹的數值?

Go 中 Goroutine 和 Channels 如何有效率地比較兩棵二元樹的數值?

Barbara Streisand
Barbara Streisand原創
2024-12-15 18:10:181001瀏覽

How Can Goroutines and Channels Efficiently Compare the Values of Two Binary Trees in Go?

Go Tour 中的等效二元樹

本練習涉及確定兩個二元樹是否包含相同的值。在您的實作中,您正確地使用 goroutine 同時遍歷兩棵樹並將它們的值傳送到通道。然而,當試圖表明樹中沒有更多元素時,就會出現問題。

避免過早關閉

在 Walk 上使用 close(ch) 會過早關閉在發送所有值之前關閉通道,因為遞歸會提前退出。相反,一個優雅的解決方案涉及使用閉包:

func Walk(t *tree.Tree, ch chan int) {
    defer close(ch) // Closes the channel when this function returns
    
    var walk func(t *tree.Tree)
    walk = func(t *tree.Tree) {
        if t == nil {
            return
        }
        
        walk(t.Left)
        ch <- t.Value
        walk(t.Right)
    }
    
    walk(t)
}

這個閉包捕獲 ch 通道並確保它僅在沒有更多節點可遍歷時才關閉。 defer close 語句確保閉包在所有遞歸呼叫完成後運行。

透過此修復,您的 Same 函數可以透過迭代地從通道接收值並比較它們來準確確定等價性。

以上是Go 中 Goroutine 和 Channels 如何有效率地比較兩棵二元樹的數值?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn