用go实现二叉树
二叉查找树(Binary Search Tree,简称BST)是一棵二叉树,它的左子节点的值比父节点的值要小,
右节点的值要比父节点的值大。它的高度决定了它的查找效率。在理想的情况下,二叉查找树增删查改的时间复杂度为O(logN)
(其中N为节点数),最坏的情况下为O(N)。当它的高度为logN+1时,我们就说二叉查找树是平衡的。
二叉树的构成
因为二叉树的节点需要可比较,所以定义了一个接口,包含了比较大小的方法和是否相等的方法
// 实现该接口则代表可比较
type compare interface {
// 如果大于返回true,否则返回false
compare(data interface{
}) bool
// 判断是否相等
equals(data interface{
}) bool
}
// 二叉树节点
type BST struct {
// 节点值
data compare
// 左节点
LeftNode *BST
// 右节点
RightNode *BST
}
// 节点值得结构体,实现了compare接口
type data struct {
key int
value interface{
}
}
func (d *data) equals(d1 interface{
}) bool {
if d.key == d1.(*data).key {
return true
}
return false
}
func (d *data) compare(d1 interface{
}) bool {
if d.key > d1.(*data).key {
return true
}
return false
}
二叉树的插入
二叉树的插入非常简单,先判断根节点是否为空,为空则直接作为根节点,
若不为空则找到需要插入位置的父节点,从根节点开始比较,小于则向左子节点靠近,
大于则靠近右子节点,找到插入位置的父节点后,再进行比较插入就行。
// insert 插入
func (b *BST) insert(content compare) {
var parent *BST
temp := b
// 先判断根节点是否为空
if temp.data == nil {
temp.data = content
return
}
// 循环遍历找到父节点
for true {
// 当节点为null时,
if temp == nil {
break
}
parent = temp
// 如果当前节点值小于插入的值,则跳向左子节点
if temp.data.compare(content) {
temp = temp.LeftNode
} else {
temp = temp.RightNode
}
}
// 比较值,进行插入赋值
if parent.data.compare(content) {
parent.LeftNode = &BST{
data: content,
LeftNode: nil,
RightNode: nil,
}
} else {
parent.RightNode = &BST{
data