Go ツアーの等価バイナリ ツリー
この演習では、2 つのバイナリ ツリーに同じ値が含まれているかどうかを判断します。実装では、ゴルーチンを適切に使用して、両方のツリーを同時に走査し、その値をチャネルに送信します。ただし、ツリーに要素がもう残っていないことを通知しようとするときに問題が発生します。
早期終了の回避
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 でゴルーチンとチャネルが 2 つのバイナリ ツリーの値を効率的に比較するにはどうすればよいでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。