最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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 向后臺協程發(fā)送指令,并阻塞等待直到收到響應,本文是使用 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 支持交叉編譯,在一個平臺上生成另一個平臺的可執(zhí)行程序,只需要按照我下面的這個環(huán)境變量表設置對應的環(huán)境變量就可以了,下面文章將對該內容做詳細介紹,感興趣的小伙伴可以參考一下
    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)用法詳解

    異常處理是程序健壯性的關鍵,往往開發(fā)人員的開發(fā)經驗的多少從異常部分處理上就能得到體現。Go語言中沒有Try?Catch?Exception機制,但是提供了panic-and-recover機制,本文就來詳細講講他們的用法
    2022-07-07

最新評論

清原| 新竹市| 治县。| 鄂托克旗| 漳州市| 蒙城县| 海门市| 内丘县| 中宁县| 新野县| 宿州市| 甘孜| 台山市| 宁国市| 安塞县| 新郑市| 抚宁县| 台山市| 邢台县| 巴南区| 大同市| 咸宁市| 布尔津县| 绿春县| 灵宝市| 西安市| 恩施市| 临沧市| 寿阳县| 浦县| 泾源县| 尉氏县| 常宁市| 石阡县| 朝阳县| 漯河市| 水城县| 车致| 台州市| 岳阳县| 梓潼县|