Äquivalente Binärbäume in der Go-Tour
Diese Übung beinhaltet die Bestimmung, ob zwei Binärbäume die gleichen Werte enthalten. In Ihrer Implementierung verwenden Sie zu Recht Goroutinen, um beide Bäume gleichzeitig zu durchlaufen und ihre Werte an Kanäle zu senden. Das Problem tritt jedoch auf, wenn versucht wird zu signalisieren, dass keine Elemente mehr in den Bäumen vorhanden sind.
Vorzeitige Schließung vermeiden
Die Verwendung von close(ch) bei Walk würde zu einer vorzeitigen Schließung führen Schließen Sie die Kanäle, bevor alle Werte gesendet werden, da die Rekursion sonst vorzeitig beendet würde. Stattdessen besteht eine elegante Lösung darin, einen Verschluss zu verwenden:
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) }
Dieser Verschluss erfasst den ch-Kanal und stellt sicher, dass er nur geschlossen wird, wenn keine Knoten mehr zum Durchqueren vorhanden sind. Die Anweisung „defer close“ stellt sicher, dass der Abschluss ausgeführt wird, nachdem alle rekursiven Aufrufe abgeschlossen sind.
Mit diesem Fix kann Ihre Same-Funktion die Äquivalenz genau bestimmen, indem sie iterativ Werte von den Kanälen empfängt und diese vergleicht.
Das obige ist der detaillierte Inhalt vonWie können Goroutinen und Kanäle die Werte zweier Binärbäume in Go effizient vergleichen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!