Go語言程式:在二叉搜尋樹中查詢floor和ceil值


二叉搜尋樹 (BST) 是一種二叉樹,其中每個節點最多有兩個子節點,通常稱為左子節點和右子節點。

在這篇Go語言文章中,我們將學習如何使用遞迴和迭代方法在二叉搜尋樹中查詢floor和ceil值。二叉搜尋樹是一種用於高效搜尋、插入和刪除元素的有用資料結構。

語法

func ceil(root *Node, val int) int {…}

ceil()函式用於在二叉搜尋樹中查詢ceil值。

func floor(root *Node, val int) int {…}

floor()函式用於在二叉搜尋樹中查詢floor值。

func floorCeil(root *Node, key int) (int, int) {…}

floorCeil()函式用於遞迴地在二叉搜尋樹中查詢floor和ceil值。

演算法

  • 步驟1 - 首先,我們需要匯入fmt包。

  • 步驟2 - 然後,初始化一個節點結構體並在其中分配三個變數。第一個變數儲存整數值,而第二個和第三個指標變數分別儲存指向左節點和右節點的地址。

  • 步驟3 - 現在,建立一個insert()函式,它接受一個節點和一個要插入的值作為輸入。此函式將節點值插入到合適的二叉搜尋樹中。

  • 步驟4 - 此函式遞迴地搜尋插入新節點的合適位置,基於二叉搜尋樹的特性。

  • 步驟5 - 現在,定義一個名為ceil()的函式。它接受一個節點根和一個值val作為輸入,並返回樹中大於或等於val的最小值。

  • 步驟6 - 然後,定義floor()函式,它接受一個節點根和一個值val作為輸入,並返回樹中小於或等於val的最大值。

  • 步驟7 - 開始main()函式。在main()函式中,將多個節點插入到二叉搜尋樹中。

  • 步驟8 - 現在,呼叫ceil()和floor()函式並將整數值作為引數傳遞給函式。

  • 步驟9 - 此外,使用fmt.Println()函式在螢幕上列印二叉搜尋樹的ceil和floor值。

示例1

在這個例子中,我們將迭代地定義一個ceil()和floor()函式,用於在二叉搜尋樹中查詢ceil和floor值。

package main

import (
   "fmt"
)

type Node struct {
   val   int
   left  *Node
   right *Node
}

func insert(root *Node, val int) *Node {
   if root == nil {
      root = &Node{val, nil, nil}
      return root
   }

   if val < root.val {
      root.left = insert(root.left, val)
   } else {
      root.right = insert(root.right, val)
   }

   return root
}

func ceil(root *Node, val int) int {
   if root == nil {
      return -1
   }

   if root.val == val {
      return root.val
   }

   if val > root.val {
      return ceil(root.right, val)
   }

   leftCeil := ceil(root.left, val)
   if leftCeil >= val {
      return leftCeil
   }

   return root.val
}

func floor(root *Node, val int) int {
   if root == nil {
      return -1
   }

   if root.val == val {
      return root.val
   }

   if val < root.val {
      return floor(root.left, val)
   	}

   rightFloor := floor(root.right, val)
   if rightFloor <= val {
      return rightFloor
   }

   return root.val
}

func main() {
   var root *Node

   root = insert(root, 10)
   insert(root, 5)
   insert(root, 15)
   insert(root, 1)
   insert(root, 8)
   insert(root, 12)
   insert(root, 18)

   fmt.Println("Floor of 9:", floor(root, 9))
   fmt.Println("Ceil of 9:", ceil(root, 9))
   fmt.Println("Floor of 11:", floor(root, 11))
   fmt.Println("Ceil of 11:", ceil(root, 11))
}

輸出

Floor of 9: -1
Ceil of 9: 10
Floor of 11: -1
Ceil of 11: 12

示例2

在這個例子中,我們將遞迴地定義一個floorCeil()函式,用於在二叉搜尋樹中查詢ceil和floor值。

package main

import (
   "fmt"
)

type Node struct {
   val   int
   left  *Node
   right *Node
}

func newnode(val int) *Node {
   node := &Node{}
   node.val = val
   node.left = nil
   node.right = nil
   return node
}

func floorCeil(root *Node, key int) (int, int) {
   floor := -1
   ceil := -1

   if root == nil {
      return floor, ceil
   }

   if root.val == key {
      return root.val, root.val
   }

   if root.val > key {
      ceil = root.val
      f, c := floorCeil(root.left, key)
      if f != -1 {
         floor = f
      }
      if c != -1 && c < ceil {
         ceil = c
      }
   } else {
      floor = root.val
      f, c := floorCeil(root.right, key)
      if f != -1 && f > floor {
         floor = f
      }
      if c != -1 {
         ceil = c
      }
   }

   return floor, ceil
}

func main() {
   root := newnode(8)
   root.left = newnode(4)
   root.right = newnode(12)
   root.left.left = newnode(2)
   root.left.right = newnode(6)
   root.right.left = newnode(10)
   root.right.right = newnode(14)

   key := 14
   floor, ceil := floorCeil(root, key)
   fmt.Printf("Floor of %d is %d\n", key, floor)
   fmt.Printf("Ceil of %d is %d\n", key, ceil)

   key = 11
   floor, ceil = floorCeil(root, key)
   fmt.Printf("Floor of %d is %d\n", key, floor)
   fmt.Printf("Ceil of %d is %d\n", key, ceil)

   key = 5
   floor, ceil = floorCeil(root, key)
   fmt.Printf("Floor of %d is %d\n", key, floor)
   fmt.Printf("Ceil of %d is %d\n", key, ceil)
}

輸出

Floor of 14 is 14
Ceil of 14 is 14
Floor of 11 is 10
Ceil of 11 is 12
Floor of 5 is 4
Ceil of 5 is 6

結論

我們已經成功地編譯並執行了一個Go語言程式,該程式使用遞迴和迭代方法在二叉搜尋樹中查詢floor和ceil值,並附帶兩個示例。在第一個示例中,我們使用了迭代方法,在第二個示例中,我們使用了遞迴方法。

更新於:2023年5月10日

瀏覽量:172

開啟你的職業生涯

透過完成課程獲得認證

開始學習
廣告