golang實現(xiàn)二叉搜索樹

關(guān)于什么是二叉搜索樹线欲,不清楚的同學(xué)可以去看我寫的這個數(shù)據(jù)結(jié)構(gòu)與算法的網(wǎng)站

數(shù)據(jù)結(jié)構(gòu)

首先我們定義需要的數(shù)據(jù)結(jié)構(gòu)。注意绑莺,TreeNode的左右節(jié)點都是*TreeNode type的,而樹只有一個Root數(shù)據(jù)域颤绕,為*TreeNode type

type TreeNode struct {
  Value int
  Left *TreeNode
  Right *TreeNode
}

type BinarySearchTree struct {
  Root *TreeNode
}

Insert

向二叉搜索樹中插入元素,首先要找到插入的位置祟身,然后再插入奥务。這里注意我們的實現(xiàn)方法為給TreeNode和BinarySearchTree這兩個type添加方法。需要注意給type添加方法的方式袜硫,同時還要注意氯葬,如果你要改變方法調(diào)用者,則需要使用指針

func (tree BinarySearchTree) Insert (v int) {
  tree.Root.Insert(v)
}

func (node *TreeNode) Insert (v int){
  if v < node.Value {
    if node.Left != nil{
      node.Left.Insert(v)
    }else{
      node.Left = &TreeNode{v, nil, nil}
    }
  }else {
    if node.Right != nil{
      node.Right.Insert(v)
    }else{
      node.Right = &TreeNode{v, nil, nil}
    }
  }
}

遍歷

樹的遍歷有前序父款,后序溢谤,中序等等。這里以中序為例憨攒。注意slice與slice指針的不同

func (tree BinarySearchTree) InOrder() []int{
  var res []int
  tree.Root.InOrder(&res)
  return res
}

func (node *TreeNode) InOrder(result *[]int) {
  if node.Left != nil{
    node.Left.InOrder(result)
  }
  *result = append(*result, node.Value)
  if node.Right != nil{
    node.Right.InOrder(result)
  }
}

最大最小值

func (tree BinarySearchTree) FindMin() int {
  node := tree.Root
  for {
    if node.Left != nil {
      node = node.Left
    }else{
      return node.Value
    }
  }
}

func (tree BinarySearchTree) FindMax() int {
  node := tree.Root
  for {
    if node.Right != nil {
      node = node.Right
    }else{
      return node.Value
    }
  }
}

查找

func (tree BinarySearchTree) Contains(v int) bool {
  node := tree.Root
  for {
    if node == nil{
      return false
    }else if (node.Value == v) {
      return true
    }else if (node.Value > v){
      node = node.Left
    }else{
      node = node.Right
    }
  }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末世杀,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子肝集,更是在濱河造成了極大的恐慌瞻坝,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件杏瞻,死亡現(xiàn)場離奇詭異所刀,居然都是意外死亡衙荐,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進(jìn)店門浮创,熙熙樓的掌柜王于貴愁眉苦臉地迎上來忧吟,“玉大人,你說我怎么就攤上這事斩披×镒澹” “怎么了?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵垦沉,是天一觀的道長煌抒。 經(jīng)常有香客問我,道長厕倍,這世上最難降的妖魔是什么寡壮? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮讹弯,結(jié)果婚禮上况既,老公的妹妹穿的比我還像新娘。我一直安慰自己闸婴,他們只是感情好坏挠,可當(dāng)我...
    茶點故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布芍躏。 她就那樣靜靜地躺著邪乍,像睡著了一般。 火紅的嫁衣襯著肌膚如雪对竣。 梳的紋絲不亂的頭發(fā)上庇楞,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天,我揣著相機(jī)與錄音否纬,去河邊找鬼。 笑死临燃,一個胖子當(dāng)著我的面吹牛睛驳,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播膜廊,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼爪瓜,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了蝶缀?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤碍论,失蹤者是張志新(化名)和其女友劉穎骑冗,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體先煎,經(jīng)...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡贼涩,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了薯蝎。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片遥倦。...
    茶點故事閱讀 38,605評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖占锯,靈堂內(nèi)的尸體忽然破棺而出袒哥,到底是詐尸還是另有隱情,我是刑警寧澤消略,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布堡称,位于F島的核電站,受9級特大地震影響艺演,放射性物質(zhì)發(fā)生泄漏却紧。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一胎撤、第九天 我趴在偏房一處隱蔽的房頂上張望晓殊。 院中可真熱鬧,春花似錦伤提、人聲如沸巫俺。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽介汹。三九已至,卻和暖如春舶沛,著一層夾襖步出監(jiān)牢的瞬間嘹承,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工冠王, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留赶撰,地道東北人。 一個月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像豪娜,于是被迫代替她去往敵國和親餐胀。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,472評論 2 348

推薦閱讀更多精彩內(nèi)容