1

二叉搜索树

二叉搜索树(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数组构建BST

测试

func main() {
    arr := []int{4, 9, 0, 1, 8, 6, 3, 5, 2, 7}
    bst := BST{nil}
    fmt.Println("创建一颗BST树")
    bst.Create(arr)
}

输出

创建一颗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))))

ufdf
6.7k 声望407 粉丝