(二)用go实现二叉查找树
本篇,我们用go简单的实现二叉查找树。
1.节点定义
type BSNode struct{
data int
left, right, parent *BSNode
}
2.前序遍历
func (p *BSNode) PreTraverse() error{
if p.data == 0 {
return errors.New("Error: no data!")
}
fmt.Printf("%d ", p.data)
if p.left != nil {
p.left.PreTraverse()
}
if p.right != nil {
p.right.PreTraverse()
}
return nil
}
3.中序遍历
func (p *BSNode) InTraverse() error{
if p.data == 0 {
return errors.New("Error: no data!")
}
if p.left != nil {
p.left.InTraverse()
}
fmt.Printf("%d ", p.data)
if p.right != nil {
p.right.InTraverse()
}
return nil
}
4.后序遍历
func (p *BSNode) PostTraverse() error{
if p.data == 0 {
return errors.New("Error: no data!")
}
if p.left != nil {
p.left.PostTraverse()
}
if p.right != nil {
p.right.PostTraverse()
}
fmt.Printf("%d ", p.data)
return nil
}
5.添加节点
func (p *BSNode) Add(data int) error {
if data == 0 {
return errors.New("Error: not support 0 value!")
}
if p.data == 0 {
p.data = data
return nil
}
if p.data == data {
return errors.New("Error: add repeated data!")
} else if data < p.data {
if p.left == nil {
p.left = new(BSNode)
p.left.data = data
p.left.parent = p
return nil
}
p.left.Add(data)
} else {
if p.right == nil {
p.right = new(BSNode)
p.right.data = data
p.right.parent = p
return nil
}
p.right.Add(data)
}
return nil
}
6.删除节点
func (p *BSNode) Delete(data int) {
bsnode := p.Find(data)
if bsnode == nil {
return
}
if bsnode.left != nil {
var tmp *BSNode
for bsnode.left != nil {
bsnode.data = bsnode.left.data
tmp = bsnode
bsnode = bsnode.left
}
tmp.left = nil
return
}
if bsnode.right != nil {
var tmp *BSNode
for bsnode.right != nil {
bsnode.data = bsnode.right.data
tmp = bsnode
bsnode = bsnode.right
}
tmp.right = nil
return
}
if bsnode.parent != nil {
if bsnode.parent.left == bsnode {
bsnode.parent.left = nil
} else {
bsnode.parent.right = nil
}
}
}
7.查询节点
func (p *BSNode) Find(data int) *BSNode {
if p.data == data {
return p
} else if data < p.data {
if p.left != nil {
return p.left.Find(data)
}
return nil
} else {
if p.right != nil {
return p.right.Find(data)
}
return nil
}
}
8.测试代码
func main() {
num := []int{50, 20, 60, 40, 80, 10, 55, 52, 56}
var root *BSNode = new(BSNode)
for _, v := range num {
root.Add(v)
}
fmt.Println("前序遍历:")
root.PreTraverse()
fmt.Printf("\n")
fmt.Println("中序遍历:")
root.InTraverse()
fmt.Printf("\n")
fmt.Println("后序遍历:")
root.PostTraverse()
fmt.Printf("\n")
bsnode := root.Find(60)
if bsnode != nil {
fmt.Println("查询结果:")
fmt.Printf("节点:%d 父节点:%d 左子节点:%d 右子节点:%d\n", bsnode.data, bsnode.parent.data, bsnode.left.data, bsnode.right.data)
}
root.Delete(50)
fmt.Println("删除后前序遍历:")
root.PreTraverse()
fmt.Printf("\n")
}
9.完整代码
package main
import (
"fmt"
"errors"
)
type BSNode struct{
data int
left, right, parent *BSNode
}
// 前序遍历
func (p *BSNode) PreTraverse() error{
if p.data == 0 {
return errors.New("Error: no data!")
}
fmt.Printf("%d ", p.data)
if p.left != nil {
p.left.PreTraverse()
}
if p.right != nil {
p.right.PreTraverse()
}
return nil
}
// 中序遍历
func (p *BSNode) InTraverse() error{
if p.data == 0 {
return errors.New("Error: no data!")
}
if p.left != nil {
p.left.InTraverse()
}
fmt.Printf("%d ", p.data)
if p.right != nil {
p.right.InTraverse()
}
return nil
}
// 后序遍历
func (p *BSNode) PostTraverse() error{
if p.data == 0 {
return errors.New("Error: no data!")
}
if p.left != nil {
p.left.PostTraverse()
}
if p.right != nil {
p.right.PostTraverse()
}
fmt.Printf("%d ", p.data)
return nil
}
// 添加节点
func (p *BSNode) Add(data int) error {
if data == 0 {
return errors.New("Error: not support 0 value!")
}
if p.data == 0 {
p.data = data
return nil
}
if p.data == data {
return errors.New("Error: add repeated data!")
} else if data < p.data {
if p.left == nil {
p.left = new(BSNode)
p.left.data = data
p.left.parent = p
return nil
}
p.left.Add(data)
} else {
if p.right == nil {
p.right = new(BSNode)
p.right.data = data
p.right.parent = p
return nil
}
p.right.Add(data)
}
return nil
}
// 删除节点
func (p *BSNode) Delete(data int) {
bsnode := p.Find(data)
if bsnode == nil {
return
}
if bsnode.left != nil {
var tmp *BSNode
for bsnode.left != nil {
bsnode.data = bsnode.left.data
tmp = bsnode
bsnode = bsnode.left
}
tmp.left = nil
return
}
if bsnode.right != nil {
var tmp *BSNode
for bsnode.right != nil {
bsnode.data = bsnode.right.data
tmp = bsnode
bsnode = bsnode.right
}
tmp.right = nil
return
}
if bsnode.parent != nil {
if bsnode.parent.left == bsnode {
bsnode.parent.left = nil
} else {
bsnode.parent.right = nil
}
}
}
// 查询节点
func (p *BSNode) Find(data int) *BSNode {
if p.data == data {
return p
} else if data < p.data {
if p.left != nil {
return p.left.Find(data)
}
return nil
} else {
if p.right != nil {
return p.right.Find(data)
}
return nil
}
}
func main() {
num := []int{50, 20, 60, 40, 80, 10, 55, 52, 56}
var root *BSNode = new(BSNode)
for _, v := range num {
root.Add(v)
}
fmt.Println("前序遍历:")
root.PreTraverse()
fmt.Printf("\n")
fmt.Println("中序遍历:")
root.InTraverse()
fmt.Printf("\n")
fmt.Println("后序遍历:")
root.PostTraverse()
fmt.Printf("\n")
bsnode := root.Find(60)
if bsnode != nil {
fmt.Println("查询结果:")
fmt.Printf("节点:%d 父节点:%d 左子节点:%d 右子节点:%d\n", bsnode.data, bsnode.parent.data, bsnode.left.data, bsnode.right.data)
}
root.Delete(50)
fmt.Println("删除后前序遍历:")
root.PreTraverse()
fmt.Printf("\n")
}
(二)用go实现二叉查找树的更多相关文章
- [BinaryTree] 二叉搜索树(二叉查找树、二叉排序树)
二叉查找树(BinarySearch Tree,也叫二叉搜索树,或称二叉排序树BinarySort Tree)或者是一棵空树,或者是具有下列性质的二叉树: (1)若它的左子树不为空,则左子树上所有结点 ...
- OBST(Optimal Binary Tree最优二叉搜索树)
二叉搜索树 二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的 ...
- 二叉查找树 C++实现(含完整代码)
一般二叉树的查找是通过遍历整棵二叉树实现,效率较低.二叉查找树是一种特殊的二叉树,可以提高查找的效率.二叉查找树又称为二叉排序树或二叉搜索树. 二叉查找树的定义 二叉排序树(Binary Search ...
- 二叉查找树(binary search tree)详解
二叉查找树(Binary Search Tree),也称二叉排序树(binary sorted tree),是指一棵空树或者具有下列性质的二叉树: 若任意节点的左子树不空,则左子树上所有结点的值均小于 ...
- 【算法】二叉查找树实现字典API
参考资料 <算法(java)> — — Robert Sedgewick, Kevin Wayne <数据结构> ...
- C++版 - 剑指offer 面试题24:二叉搜索树BST的后序遍历序列(的判断) 题解
剑指offer 面试题24:二叉搜索树的后序遍历序列(的判断) 题目:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则返回true.否则返回false.假设输入的数组的任意两个 ...
- 【算法】二叉查找树(BST)实现字典API
参考资料 <算法(java)> — — Robert Sedgewick, Kevin Wayne <数据结构> ...
- [LeetCode系列]卡特兰数(Catalan Number) 在求解独特二叉搜寻树(Unique Binary Search Tree)中的应用分析
本文原题: LeetCode. 给定 n, 求解独特二叉搜寻树 (binary search trees) 的个数. 什么是二叉搜寻树? 二叉查找树(Binary Search Tree),或者是一棵 ...
- 数据结构与算法——优先队列类的C++实现(二叉堆)
优先队列简单介绍: 操作系统表明上看着是支持多个应用程序同一时候执行.其实是每一个时刻仅仅能有一个进程执行,操作系统会调度不同的进程去执行. 每一个进程都仅仅能执行一个固定的时间,当超过了该时间.操作 ...
- 【数据结构05】红-黑树基础----二叉搜索树(Binary Search Tree)
目录 1.二分法引言 2.二叉搜索树定义 3.二叉搜索树的CRUD 4.二叉搜索树的两种极端情况 5.二叉搜索树总结 前言 在[算法04]树与二叉树中,已经介绍过了关于树的一些基本概念以及二叉树的前中 ...
随机推荐
- 环形链表I、II(含代码以及证明)
环形链表 解题思路 定义两个指针,一个快指针,一个慢指针,快指针每次移动两个节点,慢指针每次移动一个节点. 从头节点开始,让快慢指针同时移动,如果链表中有环,那么快慢指针一定会在某个节点相遇. 如果快 ...
- 固定SRAM地址变量
IAR: __no_init uint8_t _downflag @0x2001FF00;
- NET近期面试总结和面试题
一.面试总结 避坑:深圳龙岗李朗YH股份会鸽offer 因为offer被鸽重新找工作,从8号开始面试到12号(11家公司),整体感觉面试难度不大,就是很多公司都是走流程,并不是真的需要人,有些甚至聊一 ...
- 安卓逆向 JNI实先java与C互通
先来一张吊图 jdk_1.6.0_43/include/jni.h 这个头文件的地址 头文件分布 我们需要熟悉的 反射获取java中的类 1.jclass/类型 (JNICALL *FindClas ...
- 大规模 IoT 边缘容器集群管理的几种架构-2-HashiCorp 解决方案 Nomad
前文回顾 大规模 IoT 边缘容器集群管理的几种架构-0-边缘容器及架构简介 大规模 IoT 边缘容器集群管理的几种架构-1-Rancher+K3s ️Reference: IoT 边缘计算系列文章 ...
- yaml进阶用法
我们知道 json 是 yaml 的子集,作为超集的 yaml,必然有着很多与 json 不一样的特性,比如定义变量.引用.拼接等,下面来看看吧~ 为了方便和python的字典快速对比,我们直接使用y ...
- JZOJ 1389. 玩诈欺的小杉
思路 考虑一个点要不要翻,如果它左边的点为 \(1\),那么它必须翻 所以我们可以从左往右一列一列地翻 先枚举第 \(0\) 列的状态 然后之后的列就确定了 判断一下最后一列是不是 \(0\) 就行了 ...
- 前瞻性研究: axSpA中轴放射学进展延缓得益于TNF抑制剂持续治疗3年
西班牙学者近期发表的这项前瞻性研究是基于axSpA患者注册登记数据库,患者登记入库后,继续治疗和评估3年[1]. 患者分为2组,组1有46例,在登记入库时已经在用肿瘤坏死因子抑制剂(TNFi)且已治疗 ...
- Python爬虫-爬取17K小说
随笔记录方便自己和同路人查阅. #------------------------------------------------我是可耻的分割线--------------------------- ...
- mysql版本升级 5.7.21-8.0.30
当前MySQL版本为:5.7.21 升级前准备,了解5.7和8.0版本有何区别,本文主要为升级操作文档,具体建议参考官方文档,概括性的有以下几点: >默认字符集由latin1变为utf8mb4 ...