二叉搜索樹之構建

二叉搜索樹

二叉搜索樹(BST)又叫二叉查找樹(Binary Sort Tree),它是一種樹型結構,具備以下特徵:數組

  • 若它的左子樹不爲空,則左子樹上全部結點的值均小於它的根結點的值;
  • 若它的右子樹不爲空,則右子樹上全部結點的值均大於它的根結點的值
  • 它的左、右子樹分別爲二叉排序樹
  • 沒有鍵值相等的節點

設計這樣的結構主要是爲了提升查找速度(時間複雜度能夠達到O(logN))。測試

建立BST

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))))
相關文章
相關標籤/搜索