Go语言实现的树形结构数据比较算法实例

 更新时间:2015年02月20日 15:59:21   作者:不吃皮蛋  
这篇文章主要介绍了Go语言实现的树形结构数据比较算法,实例分析了树形结构数据比较算法的实现技巧,具有一定参考借鉴价值,需要的朋友可以参考下

本文实例讲述了Go语言实现的树形结构数据比较算法。分享给大家供大家参考。具体实现方法如下:

复制代码 代码如下:

// Two binary trees may be of different shapes,
// but have the same contents. For example:
//
//        4               6
//      2   6          4     7
//     1 3 5 7       2   5
//                  1 3
//
// Go's concurrency primitives make it easy to
// traverse and compare the contents of two trees
// in parallel.

package main
import (
 "fmt"
 "rand"
)

// A Tree is a binary tree with integer values.
type Tree struct {
 Left  *Tree
 Value int
 Right *Tree
}

// Walk traverses a tree depth-first,
// sending each Value on a channel.
func Walk(t *Tree, ch chan int) {
 if t == nil {
  return
 }
 Walk(t.Left, ch)
 ch <- t.Value
 Walk(t.Right, ch)
}

// Walker launches Walk in a new goroutine,
// and returns a read-only channel of values.
func Walker(t *Tree) <-chan int {
 ch := make(chan int)
 go func() {
  Walk(t, ch)
  close(ch)
 }()
 return ch
}

// Compare reads values from two Walkers
// that run simultaneously, and returns true
// if t1 and t2 have the same contents.
func Compare(t1, t2 *Tree) bool {
 c1, c2 := Walker(t1), Walker(t2)
 for <-c1 == <-c2 {
  if closed(c1) || closed(c1) {
   return closed(c1) == closed(c2)
  }
 }
 return false
}

// New returns a new, random binary tree
// holding the values 1k, 2k, ..., nk.
func New(n, k int) *Tree {
 var t *Tree
 for _, v := range rand.Perm(n) {
  t = insert(t, (1+v)*k)
 }
 return t
}

func insert(t *Tree, v int) *Tree {
 if t == nil {
  return &Tree{nil, v, nil}
 }
 if v < t.Value {
  t.Left = insert(t.Left, v)
  return t
 }
 t.Right = insert(t.Right, v)
 return t
}

func main() {
 t1 := New(1, 100)
 fmt.Println(Compare(t1, New(1, 100)), "Same Contents")
 fmt.Println(Compare(t1, New(1, 99)), "Differing Sizes")
 fmt.Println(Compare(t1, New(2, 100)), "Differing Values")
 fmt.Println(Compare(t1, New(2, 101)), "Dissimilar")
}

希望本文所述对大家的Go语言程序设计有所帮助。

相关文章

  • Golang error使用场景介绍

    Golang error使用场景介绍

    我们在使用Golang时,不可避免会遇到异常情况的处理,与Java、Python等语言不同的是,Go中并没有try...catch...这样的语句块,这个时候我们如何才能更好的处理异常呢?本文来教你正确方法
    2023-03-03
  • 用golang实现一个定时器任务队列实例

    用golang实现一个定时器任务队列实例

    golang中提供了2种定时器timer和ticker,分别是一次性定时器和重复任务定时器。这篇文章主要介绍了用golang实现一个定时器任务队列实例,非常具有实用价值,需要的朋友可以参考下
    2018-05-05
  • Golang 实现 Redis系列(六)如何实现 pipeline 模式的 redis 客户端

    Golang 实现 Redis系列(六)如何实现 pipeline 模式的 redis 客户端

    pipeline 模式的 redis 客户端需要有两个后台协程负责 tcp 通信,调用方通过 channel 向后台协程发送指令,并阻塞等待直到收到响应,本文是使用 golang 实现 redis 系列的第六篇, 将介绍如何实现一个 Pipeline 模式的 Redis 客户端。
    2021-07-07
  • golang 如何获取文件夹下面的文件列表

    golang 如何获取文件夹下面的文件列表

    这篇文章主要介绍了golang 获取文件夹下面的文件列表方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-05-05
  • gorm FirstOrCreate和受影响的行数实例

    gorm FirstOrCreate和受影响的行数实例

    这篇文章主要介绍了gorm FirstOrCreate和受影响的行数实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • Go语言扫描目录并获取相关信息的方法

    Go语言扫描目录并获取相关信息的方法

    这篇文章主要介绍了Go语言扫描目录并获取相关信息的方法,实例分析了Go语言操作目录及文件的技巧,需要的朋友可以参考下
    2015-03-03
  • golang交叉编译详细

    golang交叉编译详细

    Golang 支持交叉编译,在一个平台上生成另一个平台的可执行程序,只需要按照我下面的这个环境变量表设置对应的环境变量就可以了,下面文章将对该内容做详细介绍,感兴趣的小伙伴可以参考一下
    2021-10-10
  • golang如何获得一个变量的类型

    golang如何获得一个变量的类型

    这篇文章主要介绍了golang获得一个变量类型的实现方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-05-05
  • Golang中ringbuffer的实现与应用场景详解

    Golang中ringbuffer的实现与应用场景详解

    ringbuffer因为它能复用缓冲空间,通常用于网络通信连接的读写,虽然市面上已经有了go写的诸多版本的ringbuffer组件,但还是自己造一个吧
    2023-06-06
  • Go语言异常处理(Panic和recovering)用法详解

    Go语言异常处理(Panic和recovering)用法详解

    异常处理是程序健壮性的关键,往往开发人员的开发经验的多少从异常部分处理上就能得到体现。Go语言中没有Try Catch Exception机制,但是提供了panic-and-recover机制,本文就来详细讲讲他们的用法
    2022-07-07

最新评论