二叉搜索树之构建

二叉搜索树

二叉搜索树(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))))

Salamander
上帝在我很小的时候送给我了两个苹果,一个红苹果,一个蓝苹果。红苹果代表疯狂,蓝苹果代表思考
6.7k 声望
407 粉丝
0 条评论
推荐阅读
Java AtomicInteger类使用
这个问题发生的原因是++counter不是一个原子性操作。当要对一个变量进行计算的时候,CPU需要先从内存中将该变量的值读取到高速缓存中,再去计算,计算完毕后再将变量同步到主内存中。这在多线程环境中就会遇到问...

pigLoveRabbit2阅读 2.3k

openKylin 0.9.5版本正式发布,加速国产操作系统自主创新进程!
2023年1月12日,中国桌面操作系统根社区openKylin(开放麒麟)正式发布openKylin 0.9.5操作系统版本。此版本充分适应5G时代需求,打通平板,PC等设备,实现多端融合,弥补了国产操作系统的短板,有效推动国产操作...

openKylin6阅读 7.4k

封面图
杨辉三角的5个特性,一个比一个牛皮!
杨辉三角按照杨辉于1261年所编写的《详解九章算法》一书,里面有一张图片,介绍此种算法来自于另外一个数学家贾宪所编写的《释锁算书》一书,但这本书早已失传无从考证。但可以肯定的是这一图形的发现我国不迟于1...

小傅哥3阅读 1.5k

不会数学的程序员,只能走到初级开发工程师!
在我还是初级程序员时,每天也都粘贴着代码和包装着接口。那个阶段并没有意识到数学能在编程中起到什么作用,就算学了数学的部分知识,也没法用到编程中。但后来随着编程越来越久,逐步接手核心代码块开发时候,...

小傅哥3阅读 658

封面图
stackoverflow 提问:“计算两个整数的最小公倍数的最有效方法是什么?”
作者:小傅哥博客:[链接]源码:[链接]沉淀、分享、成长,让自己和他人都能有所收获!😄一、前言嘿,小傅哥怎么突然讲到最大公约数了?这么想你肯定是没有好好阅读前面章节中小傅哥讲到的RSA算法,对于与欧拉结果...

小傅哥3阅读 1.5k

封面图
视频清晰度优化指南
随着移动互联网的深入发展,视频消费场景逐渐变成主流,早期由于手机硬件的限制问题,导致生产出来的视频画质、清晰度存在较大的问题,用户体验不太好,当时的网络也处于4G的发展阶段,网络的限制也无法持续支持...

得物技术2阅读 926

为什么不能用斐波那契散列,做数据库路由算法?
斐波那契数列出现在印度数学中,与梵文韵律有关。在梵语诗歌传统中,人们对列举所有持续时间为 2 单位的长 (L) 音节与 1 单位持续时间的短 (S) 音节并列的模式很感兴趣。用给定的总持续时间计算连续 L 和 S 的不...

小傅哥1阅读 759

封面图
6.7k 声望
407 粉丝
宣传栏