等价二叉树
04 Oct 2017原理
不同二叉树的叶节点上可以保存相同的值序列。例如,以下两个二叉树都保存了序列 1,1,2,3,5,8,13 。
可以使用递归来将遍历二叉树,通过 channel 来传递每个节点的值,然后比较依次比较每个节点的值,
- 如果长度不一致,则二叉树不等价。
- 如果有节点的值不相等,则二叉树不等价。
- 否则,二叉树等价
代码实现
package main
import (
"fmt"
"golang.org/x/tour/tree"
)
// Walk 步进 tree t 将所有的值从 tree 发送到 channel ch。
func WalkImpl(t *tree.Tree, ch chan int) {
if t == nil {
return
}
WalkImpl(t.Left, ch)
ch <- t.Value
WalkImpl(t.Right, ch)
}
func Walk(t *tree.Tree, ch chan int) {
WalkImpl(t, ch)
close(ch)
}
// Same 检测树 t1 和 t2 是否含有相同的值。
func Same(t1, t2 *tree.Tree) bool {
ch1, ch2 := make(chan int), make(chan int)
go Walk(t1, ch1)
go Walk(t2, ch2)
for {
v1, ok1 := <-ch1
v2, ok2 := <-ch2
if !ok1 || !ok2 {
return ok1 == ok2
}
if v1 != v2 {
return false
}
}
}
func main() {
fmt.Print("tree.New(1) == tree.New(1): ")
if Same(tree.New(1), tree.New(1)) {
fmt.Println("PASSED")
} else {
fmt.Println("FAILED")
}
fmt.Print("tree.New(1) != tree.New(2): ")
if !Same(tree.New(1), tree.New(2)) {
fmt.Println("PASSED")
} else {
fmt.Println("FAILED")
}
}
运行结果
tree.New(1) == tree.New(1): PASSED
tree.New(1) != tree.New(2): PASSED