用go实现二叉树

用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
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值