Go 数据结构--二分查找树

今天开始一个Go实现常见数据结构的系列吧。有时间会更新其他数据结构。

一些概念

二叉树:二叉树是每个节点最多有两个子树的树结构。

完全二叉树:若设二叉树的高度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第h层有叶子结点,并且叶子结点都是从左到右依次排布,这就是完全二叉树

满二叉树:除了叶结点外每一个结点都有左右子叶且叶子结点都处在最底层的二叉树。

平衡二叉树:平衡二叉树又被称为AVL树(区别于AVL算法),它是一棵二叉排序树,且具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。

二叉查找树:它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树

二叉搜索树原理

二叉排序树的查找过程和次优二叉树类似,通常采取二叉链表作为二叉排序树存储结构中序遍历二叉排序树可得到一个关键字的有序序列,一个无序序列可以通过构造一棵二叉排序树变成一个有序序列,构造树的过程即为对无序序列进行排序的过程。每次插入的新的结点都是二叉排序树上新的叶子结点,在进行插入操作时,不必移动其它结点,只需改动某个结点的指针,由空变为非空即可。搜索,插入,删除的复杂度等于树高,O(log(n)).

实现

上述基本是百度百科的概念,现在来直接上实现代码:

/*
时间:2017/8/24
功能:二叉树
*/ package main import (
"fmt"
"sync"
) //二叉树节点结构
type Node struct {
data int
left *Node
right *Node
} //二叉查找树结构
type BST struct {
root *Node
lock sync.RWMutex
} //插入方法(判断位置 中序遍历)
func insertNode(node *Node, addNode *Node) {
if addNode.data < node.data {
if node.left == nil {
node.left = addNode
} else {
insertNode(node.left, addNode)
}
} else {
if node.right == nil {
node.right = addNode
} else {
insertNode(node.right, addNode)
}
}
} //插入操作
func (t *BST) Insert(data int) {
t.lock.Lock()
defer t.lock.Unlock()
node := &Node{
data: data,
left: nil,
right: nil,
}
if t.root == nil {
t.root = node
} else {
insertNode(t.root, node)
}
} //先序遍历
func PreOrderTraverse(bst *Node) {
if bst != nil {
fmt.Printf("%d ", bst.data)
PreOrderTraverse(bst.left)
PreOrderTraverse(bst.right)
}
} //中序遍历
func InOrderTraverse(bst *Node) {
if bst != nil {
InOrderTraverse(bst.left)
fmt.Printf("%d ", bst.data)
InOrderTraverse(bst.right)
}
} //后序遍历
func PostOrderTraverse(bst *Node) {
if bst != nil {
PostOrderTraverse(bst.left)
PostOrderTraverse(bst.right)
fmt.Printf("%d ", bst.data)
}
} //查找
func SearchBST(node *Node, key int) bool {
if node == nil {
return false
}
if key == node.data {
return true
}
if key < node.data {
return SearchBST(node.left, key)
} else {
return SearchBST(node.right, key)
}
} //删除执行函数
func remove(node *Node, key int) *Node {
if node == nil {
return nil
}
if key == node.data {
if node.left == nil && node.right == nil {
node = nil
return nil
}
if node.left == nil {
node = node.right
return node
}
if node.right == nil {
node = node.left
return node
}
rightside := node.right
for {
if rightside != nil && rightside.left != nil {
rightside = rightside.left
} else {
break
}
}
node.data = rightside.data
node.right = remove(node.right, node.data)
return node
}
if key < node.data {
node.left = remove(node.left, key)
return node
} else {
node.right = remove(node.right, key)
return node
}
} //删除操作
func (t *BST) Remove(key int) {
t.lock.Lock()
defer t.lock.Unlock()
remove(t.root, key)
} func main() {
var t BST
t.Insert(2)
t.Insert(6)
t.Insert(5)
t.Insert(1)
t.Insert(10)
t.Insert(8) fmt.Println("PREORDER...")
PreOrderTraverse(t.root)
fmt.Println("\nINORDER...")
InOrderTraverse(t.root)
fmt.Println("\nPOSTORDER...")
PostOrderTraverse(t.root)
fmt.Printf("\n")
fmt.Println("Search...")
fmt.Println(SearchBST(t.root, 6))
fmt.Println("Remove...")
t.Remove(6)
fmt.Println("PREORDER...")
PreOrderTraverse(t.root)
fmt.Println("\nINORDER...")
InOrderTraverse(t.root)
fmt.Println("\nPOSTORDER...")
PostOrderTraverse(t.root)
fmt.Printf("\n")
fmt.Println("Search...")
fmt.Println(SearchBST(t.root, 6))
}

执行结果

PREORDER...
2 1 6 5 10 8
INORDER...
1 2 5 6 8 10
POSTORDER...
1 5 8 10 6 2
Search...
true
Remove...
PREORDER...
2 1 8 5 10
INORDER...
1 2 5 8 10
POSTORDER...
1 5 10 8 2
Search...
false

总结

照例得总结一波,其实每什么好总结的,大家都熟悉的数据结构。在增删查的复杂度比较均衡。拿来练手非常不错。

Go 数据结构--二分查找树的更多相关文章

  1. lintcode-106-排序列表转换为二分查找树

    106-排序列表转换为二分查找树 给出一个所有元素以升序排序的单链表,将它转换成一棵高度平衡的二分查找树 样例 标签 递归 链表 思路 类似于二分查找,每次将链表二分,中间节点作为根节点,在建立左子树 ...

  2. 笔试算法题(58):二分查找树性能分析(Binary Search Tree Performance Analysis)

    议题:二分查找树性能分析(Binary Search Tree Performance Analysis) 分析: 二叉搜索树(Binary Search Tree,BST)是一颗典型的二叉树,同时任 ...

  3. 手把手教你用java实现二分查找树及其相关操作

    二分查找树(Binary Search Tree)的基本操作有搜索.求最大值.求最小值.求前继.求后继.插入及删除. 对二分查找树的进行基本操作所花费的时间与树的高度成比例.例如有n个节点的完全二叉树 ...

  4. 数据结构---平衡查找树之B树和B+树(转)

    本文转载自:http://www.cnblogs.com/yangecnu/p/Introduce-B-Tree-and-B-Plus-Tree.html 前面讲解了平衡查找树中的2-3树以及其实现红 ...

  5. SPOJ TEMPLEQ - Temple Queues(二分查找+树状数组)

    题意: 有N个队伍(1 <= N <= 100,000),每个队伍开始有ai个人[0 <= ai<= 100,000,000],有Q个操作[0<=Q<= 500,0 ...

  6. python数据结构之树(二分查找树)

    本篇学习笔记记录二叉查找树的定义以及用python实现数据结构增.删.查的操作. 二叉查找树(Binary Search Tree) 简称BST,又叫二叉排序树(Binary Sort Tree),是 ...

  7. Holedox Eating HDU - 4302 2012多校C 二分查找+树状数组/线段树优化

    题意 一个长度$n<=1e5$的数轴,$m<=1e5$个操作 有两种一些操作 $0$  $x$ 在$x$放一个食物 $1$ 一个虫子去吃最近的食物,如果有两个食物一样近,不转变方向的去吃 ...

  8. 二分查找树按照key值划分

    #include <iostream>#include <vector>#include <algorithm>#include <string>#in ...

  9. js二分查找树实现

    function BinaryTree() { var Node = function(key) { this.key = key; this.left = null; this.right = nu ...

随机推荐

  1. Oracle查询多行数据合并成一行数据

    例如: select base_id, translate (ltrim (text1, '/'), '*/', '*,') xmmc,translate (ltrim (text2, '/'), ' ...

  2. 如何快速轻松学习bootstrap

    我以前也是通过看一些视频教程来学的,比如慕课网上的,比如51cto上的那些零基础入门bootstrap什么的,还有一些培训班里流传出来的,感觉晕乎乎的,不知所云. 还是在后面不断使用的过程中慢慢体会到 ...

  3. 华为CloudIDE免费公测,带你出坑带你飞

    你的代码仓库上线了吗?是不是有时候遇到这样的问题? 只想浏览一下代码,却发现线上浏览效果不佳,高亮显示什么的都没有.而在桌面端浏览要需要先同步代码,再用桌面端的IDE打开.尤其是使用git的时候,先要 ...

  4. 如何开始使用bootstrap

    登陆Bootstrap官网:http://getbootstrap.com/ Bootstrap中的JS插件依赖于jQuery,因此jQuery要在Bootstrap之前引用 bootstrap框架初 ...

  5. linux下文件查找工具--find

    常用的文件查找命令有:which,locate,find 1.which命令 查找二进制数或二进制命令,由PATH给出 2.loacte 特点: 1.非实时,每天在系统上生成数据库,通过数据库查询 2 ...

  6. maven简介及基础使用

    一.Maven简介 Maven可译为"知识的积累"."专家",主要服务于基于Java平台的项目构建.依赖管理和项目信息管理. 1.Maven-项目构建工具    ...

  7. 【CSS】font样式简写(转)- 不是很建议简写

    一.字体属性主要包括下面几个 font-family,font-style,font-variant,font-weight,font-size,font font-family(字体族): “Ari ...

  8. NOIP2011玛雅游戏

    闲的没事干,出来写一下早两天刷的一道搜索题NOIP2011玛雅游戏,其实这道题还是比较水的,虽然看起来可能有点复杂. 方法很简单粗暴,直接根据规则模拟就行. 话不多说直接上代码(关键操作在注释中有提到 ...

  9. CentOS 访问 Windows 共享目录

    起因 由于公司的网络切换后,将所有的服务器都切换到了指定的网段(工作电脑在一个网络,服务器在另一个网络:这样一来,不同部门的 work stations 可以彼此访问,不同部门的服务器(servers ...

  10. 如何免费使用jrebel 和eclipse 项目配合完成热部署功能

    天,感谢王同学分享了热部署插件,jrebel,说修改后台代码可以不用重启tomcat,于是立即下载使用....本来很简单的一个事情,因为参照了网上各种帖子,结果坑的不行....所以把自己的经验分享一下 ...