バイナリ ツリーの Go 等価性テスト
Go ツアーの演習 #7 で見られるように、バイナリ ツリーの等価性テストは、同じ値を含む 2 つのツリーの等価性。両方のツリーを同時に走査し、それらの値をチャネルに送信することでこれを達成しようとすることもできます。ただし、トラバーサルの終了と残りの要素がないことの通知を確実に行うことは、重大な障害であることがわかります。
提供されたコードは、ツリーからチャネルに値を送信し、それらの値を同時に消費することで、このタスクを処理しようとします。同じ関数内で。ただし、Walk 関数内で close(ch) を使用すると、チャネルが途中で終了し、すべての値が送信されなくなるため問題があります。
幸いなことに、クロージャを利用して問題を解決するエレガントなソリューションが golang-nuts グループから登場しました。この問題:
func Walk(t *tree.Tree, ch chan int) { defer close(ch) // Closes the channel upon function return 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) }
修正されたコードでは、クロージャを利用してツリー トラバーサルを実装しています。 defer ステートメントは、トラバースの完了時にチャネルが確実に閉じられるようにします。このメカニズムは、残りの要素がないことの通知を適切に処理し、正確な等価性チェックを保証します。
以上がGo でバイナリ ツリーの等価性を効率的にテストするにはどうすればよいでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。