Go ツアー演習 #7: バイナリ ツリーの等価性
Go ツアー演習「バイナリ ツリー」では、2 つのバイナリ ツリーに次の要素が含まれているかどうかを判断することが求められます。同じ価値観。この演習では、ツリーを走査してその値をチャネルに送信する再帰的な Walk 関数の作成に焦点を当てます。
提供したコードでは、ツリーがいつ完全に走査されたかを判断する問題が発生します。チャネルを閉じることは直感的に見えるかもしれませんが、Walk 関数の再帰的な性質により、トラバースが途中で終了してしまいます。
この問題に対する 1 つの解決策は、クロージャを利用することです。 Walk 関数のクロージャベースのバージョンを利用すると、すべての値が送信されるまでチャネルを閉じるのを延期できます。以下の変更されたコードは、この手法を示しています。
func Walk(t *tree.Tree, ch chan int) { defer close(ch) // Automatically 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) }
この変更により、Walk 関数はすべての値が送信されると自動的にチャネルを閉じ、トラバーサルの完了を通知します。これにより、Same 関数はチャネルから値を受け取り、それらが同一であることを確認することで、両方のツリーからの値を効果的に比較できます。
以上がGo でバイナリ ツリーを効率的に比較する方法: Go ツアー演習 #7 を解く?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。