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中文網其他相關文章!