tasks a-s
This commit is contained in:
parent
47bf37c096
commit
b83f433714
12433 changed files with 156208 additions and 123 deletions
71
Task/Same-Fringe/Go/same-fringe.go
Normal file
71
Task/Same-Fringe/Go/same-fringe.go
Normal file
|
|
@ -0,0 +1,71 @@
|
|||
package main
|
||||
|
||||
import "fmt"
|
||||
|
||||
type node struct {
|
||||
int
|
||||
left, right *node
|
||||
}
|
||||
|
||||
// function returns a channel that yields the leaves of the tree.
|
||||
// the channel is closed after all leaves are received.
|
||||
func leaves(t *node) chan int {
|
||||
ch := make(chan int)
|
||||
// recursive function to walk tree.
|
||||
var f func(*node)
|
||||
f = func(n *node) {
|
||||
if n == nil {
|
||||
return
|
||||
}
|
||||
// leaves are identified by having no children.
|
||||
if n.left == nil && n.right == nil {
|
||||
ch <- n.int
|
||||
} else {
|
||||
f(n.left)
|
||||
f(n.right)
|
||||
}
|
||||
}
|
||||
// goroutine runs concurrently with others.
|
||||
// it walks the tree then closes the channel.
|
||||
go func() {
|
||||
f(t)
|
||||
close(ch)
|
||||
}()
|
||||
return ch
|
||||
}
|
||||
|
||||
func sameFringe(t1, t2 *node) bool {
|
||||
f1 := leaves(t1)
|
||||
f2 := leaves(t2)
|
||||
for l1 := range f1 {
|
||||
// both trees must yield a leaf, and the leaves must be equal.
|
||||
if l2, ok := <-f2; !ok || l1 != l2 {
|
||||
return false
|
||||
}
|
||||
}
|
||||
// there must be nothing left in f2 after consuming all of f1.
|
||||
_, ok := <-f2
|
||||
return !ok
|
||||
}
|
||||
|
||||
func main() {
|
||||
// the different shapes of the trees is shown with indention.
|
||||
// the leaves are easy to spot by the int: key.
|
||||
t1 := &node{3,
|
||||
&node{1,
|
||||
&node{int: 1},
|
||||
&node{int: 2}},
|
||||
&node{8,
|
||||
&node{int: 5},
|
||||
&node{int: 13}}}
|
||||
// t2 with negative values for internal nodes that can't possibly match
|
||||
// positive values in t1, just to show that only leaves are being compared.
|
||||
t2 := &node{-8,
|
||||
&node{-3,
|
||||
&node{-1,
|
||||
&node{int: 1},
|
||||
&node{int: 2}},
|
||||
&node{int: 5}},
|
||||
&node{int: 13}}
|
||||
fmt.Println(sameFringe(t1, t2)) // prints true.
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue