二叉搜索樹(BST)又叫二叉查找樹(Binary Sort Tree),它是一種樹型結構,具備以下特徵:數組
設計這樣的結構主要是爲了提升查找速度(時間複雜度能夠達到O(logN))。測試
package main import "fmt" type TreeNode struct { data int lChild *TreeNode rChild *TreeNode } const MaxUint = ^uint(0) const MinUint = 0 const MaxInt = int(MaxUint >> 1) const MinInt = -MaxInt - 1 type BST struct { Root *TreeNode // 根節點指針 } func (this *BST) Insert(item int) bool { return this.insertItem(&this.Root, item) } func (this *BST) insertItem(pp **TreeNode, item int) bool { p := *pp if p == nil { *pp = &TreeNode{ data: item, lChild: nil, rChild: nil, } return true } else if item == p.data { return false } else if item < p.data { return this.insertItem(&((*pp).lChild), item) // 添加到左子樹 } else { return this.insertItem(&((*pp).rChild), item) // 添加到右子樹 } } func (this *BST) Display() { this.displayBST(this.Root) } func (this *BST) displayBST(p *TreeNode) { if p != nil { fmt.Printf("%d", p.data) if p.lChild != nil || p.rChild != nil { fmt.Print("(") this.displayBST(p.lChild) if p.rChild != nil { fmt.Print(",") this.displayBST(p.rChild) } fmt.Print(")") } } } func (this *BST) Create(nums []int) { for idx, item := range nums { if this.Insert(item) { fmt.Printf("第%d步,插入%d:", idx+1, item) this.Display() fmt.Print("\n") } } }
上述程序根據傳入的nums
數組構建BSTui
func main() { arr := []int{4, 9, 0, 1, 8, 6, 3, 5, 2, 7} bst := BST{nil} fmt.Println("建立一顆BST樹") bst.Create(arr) }
輸出this
建立一顆BST樹 第1步,插入4:4 第2步,插入9:4(,9) 第3步,插入0:4(0,9) 第4步,插入1:4(0(,1),9) 第5步,插入8:4(0(,1),9(8)) 第6步,插入6:4(0(,1),9(8(6))) 第7步,插入3:4(0(,1(,3)),9(8(6))) 第8步,插入5:4(0(,1(,3)),9(8(6(5)))) 第9步,插入2:4(0(,1(,3(2))),9(8(6(5)))) 第10步,插入7:4(0(,1(,3(2))),9(8(6(5,7))))