当前位置: 首页 > wzjs >正文

我的世界做圆网站流量对网站的作用

我的世界做圆网站,流量对网站的作用,全平台响应式网站建设,wordpress 自定义类型目录 一、概念、性质二、二叉搜索树的实现1. 结构2. 查找3. 插入4. 删除5. 中序遍历 中序前驱/后继结点 一、概念、性质 二叉搜索树(Binary Search Tree),简写BST,又称为二叉查找树 它满足: 空树是一颗二叉搜索树对…

目录

  • 一、概念、性质
  • 二、二叉搜索树的实现
    • 1. 结构
    • 2. 查找
    • 3. 插入
    • 4. 删除
    • 5. 中序遍历
  • 中序前驱/后继结点

一、概念、性质

二叉搜索树(Binary Search Tree),简写BST,又称为二叉查找树

它满足:

  • 空树是一颗二叉搜索树
  • 对于任意结点 node ,它的左右孩子如果不为空 ,满足:
    • 左子树上所有结点的值都小于node的值
    • 右子树上所有结点的值都大于node的值
  • 不存在数值重复的结点

如下图,图(1)是二叉搜索树,图(2)、图(3)不是二叉搜索树
图(2)中不满足 70 < 50
图(3)中不满足 30 < 10

在这里插入图片描述


之所以叫做二叉搜索树,是因为在BST中搜索一个值是很简单的

例如图(1)中要查找40
从根结点出发,40比50小,来到根结点的左孩子30,40比30大,来到30的右孩子40,40等于40,这样就找到了

例如图(1)中要查找10
从根结点出发,10比50小,来到根节点的左孩子30,10比30小,来到30的左孩子20,10比20小,来到20的左孩子null,所以没有10这个结点


在这里插入图片描述

对图(1)进行中序遍历,得到 20 30 40 50 60
发现是一个有序的序列

所以对二叉搜索树进行中序遍历,会得到一个有序的序列

二、二叉搜索树的实现

1. 结构

定义一个二叉搜索树很简单,就和定义一个二叉树的结构一样,需要包含 数据、左右孩子指针

// 定义结点结构
type TSNode struct {data  intleft  *TSNoderight *TSNode
}

2. 查找

查找一个值target,从根结点开始,递归进行比较。

如果等于根结点,找到返回
如果小于根结点则走到左子树,在左子树中找
如果大于根结点则走到右子树,在右子树中找

// 判断结点是否存在
func (t *TSNode) Search(data int) *TSNode {if t == nil {return nil}if t.data == data { //找到了 返回结点return t}if data < t.data { //要找的数据小于根结点 向左找return t.left.Search(data)} else { //要找的数据大于根结点  向右找return t.right.Search(data)}
}

3. 插入

向二叉搜索树插入数据data ,分为两种情况

  • 树为空,定义一个新结点储存data,直接 根结点 = 新结点
  • 树不为空,和结点进行比较(和查找数据步骤一样),直到结点为空,将新结点插入

如向图(1)中插入数据35
在这里插入图片描述

  1. 首先和根结点50进行比较,小于50,走到左孩子30
  2. 和30进行比较,大于30,走到30的右孩子40
  3. 和40进行比较,小于40,走到40的左孩子 null,将35 插入40 左孩子

最终得到
在这里插入图片描述

// 插入数据
func (t *TSNode) Insert(data int) {newNode := &TSNode{data,nil,nil,}//如果根结点为空 直接插入if t == nil {t = newNodereturn}//根结点不为空 判断if data < t.data { //小于根结点数据 向左找if t.left == nil { //左孩子为空 直接赋值t.left = newNode} else {t.left.Insert(data) //左孩子不为空 遍历左孩子 找}} else {if t.right == nil {t.right = newNode} else {t.right.Insert(data)}}
}

4. 删除

删除二叉搜索树的数据分为三种情况

  • 要删除的结点没有左右孩子
  • 要删除的结点没有左孩子或右孩子
  • 要删除的结点既有左孩子也有右孩子

有这样一颗二叉搜索树,下面第一二种拿这个举例子

在这里插入图片描述

  1. 删除的结点没有左右孩子

直接删除结点就可以
例如删除上图中的25,直接删除25得到
在这里插入图片描述

  1. 要删除的结点只有左孩子或只有右孩子

如果只有右孩子,比如删除图中的60
直接让60父结点与60的右孩子连接,将60删除就可以
得到:
在这里插入图片描述
3. 要删除的结点既有左孩子也有右孩子

这里要引入中序后继中序前驱的概念,我把这两个概念放在最后了

blog.csdnimg.cn/direct/e37cc3938fe3426b925afd7c3c2237fd.png)

比如要删除30,找到30的中序后继结点或者中序前驱结点,哪个都可以,就拿中序后继结点举例子

30的中序后继结点是35,将35的值赋给30这个节点,再对30的右子树进行删除中序后继结点的操作就可以了

在这里插入图片描述

使用中序前驱结点一样,将中序前驱节点的值赋给要删除的节点的值,再对要删除的节点的左子树进行删除中序前驱节点的操作


实现删除操作的代码:

首先要找到要删除的结点, if、else if、else 就是在找要删除的结点

// 删除结点
func (t *TSNode) Delete(data int) *TSNode {//查找结点 -- 查找到要找的结点,分情况对结点进行删除操作if t == nil {return nil}if data < t.data { //要删除的数据小于根结点//递归查找左子树t.left = t.left.Delete(data)} else if data > t.data {//递归查找右子树t.right = t.right.Delete(data)} else { //查找到了要删除的数据//此时t是要删除的结点 分情况if t.left == nil && t.right == nil { //如果左右孩子都是空 直接删除 返回空return nil}//只有一个结点if t.left == nil { //只有一个右结点  父结点和左孩子结点相连return t.right}if t.right == nil { //只有一个左结点  父结点和右孩子结点相连return t.left}//左右孩子结点都存在//找到 中序后继结点 -- 右孩子一直向左找minNode := t.right.MinNode()//用这个结点替换要删除的结点t.data = minNode.data//删除中序后继结点--因为是查找的右孩子的中序后继,所以调整右子树t.right = t.right.Delete(minNode.data)}return t
}// 查找中序后继结点  
func (t *TSNode) MinNode() *TSNode {if t.left == nil {return t}return t.left.MinNode()
}

5. 中序遍历

使用递归遍历,和二叉树的中序遍历一样
先递归左子树,再打印节点的值,最后递归右子树

// 中序遍历
func (t *TSNode) InOrder() {if t == nil {return}t.left.InOrder()fmt.Printf("%d ", t.data)t.right.InOrder()
}

中序前驱/后继结点

在这里插入图片描述

  • 中序后继结点:在中序遍历中紧跟在某个节点后面的节点
    怎么找中序后继结点呢?
    先走到一个结点Node 的右孩子,再从右孩子不断向左走,直到某个节点的左孩子为空,那这个结点就是Node 的中序后继结点
    比如要找30的中序后继结点,30走到40,40向左走到35,35的左孩子为空,那35就是30的后继结点

  • 中序前驱结点:在中序遍历中在某个结点前一个的结点
    怎么找中序前驱结点呢?
    先走到一个结点Node 的左孩子,再从左孩子不断向右走,直到某个节点的右孩子为空,那这个结点就是Node 的中序前驱结点
    比如要找30的中序前驱结点,30走到左孩子20,20向右走到25,25的右孩子为空,所以25就是30的中序前驱结点


文章转载自:

http://HBKkktAU.prgyd.cn
http://oWOSP5ed.prgyd.cn
http://TRV3dBAT.prgyd.cn
http://OQy5r98M.prgyd.cn
http://Jw5eCfRn.prgyd.cn
http://Fx6Lg5IU.prgyd.cn
http://n9onQSrs.prgyd.cn
http://osmX2qIO.prgyd.cn
http://vkGQBZjw.prgyd.cn
http://NeItqvD6.prgyd.cn
http://9fB1HpzP.prgyd.cn
http://tIooXbXA.prgyd.cn
http://osW1U95i.prgyd.cn
http://iq57K4Gh.prgyd.cn
http://K99waA8t.prgyd.cn
http://sUCu8sHu.prgyd.cn
http://DUpeaqni.prgyd.cn
http://eNP5LFRc.prgyd.cn
http://yiag1BrC.prgyd.cn
http://IIybtWQ8.prgyd.cn
http://HfPWMJsd.prgyd.cn
http://ZMdJ0nfb.prgyd.cn
http://MBocycw8.prgyd.cn
http://txvTiIKd.prgyd.cn
http://qjeA0BA7.prgyd.cn
http://e45muNGE.prgyd.cn
http://R30iE5sr.prgyd.cn
http://eVPvIbQc.prgyd.cn
http://MYO0Iupj.prgyd.cn
http://bbgBwhMz.prgyd.cn
http://www.dtcms.com/wzjs/639627.html

相关文章:

  • 十堰英文网站建设必应搜索推广
  • 办公室工作绩效 网站建设我要创业找项目
  • h5页面制作网站免费有什么网站可以做推广
  • 甘肃省建设工程网站ps做全屏网站画布要多大
  • 建设银行此网站的安全证书有问题.江宁建设局网站
  • 广东网站设计公司电话深圳创业印章
  • 如何制作网页网站三三网是什么网站
  • 山东网站推广公司wordpress html音乐
  • 网站建设企业网站建设河北网站建设与推广
  • 有做思维图的网站吗城市建设网站鹤岗市
  • 学校网站网页设计怎么自己搭建博客网站
  • 公司做网站百度还是阿里免费设计网站素材
  • 哪些网站是django做的淄博百度推广
  • 深圳公司网站建设设计山东省交通厅建设网站首页
  • 域名如何绑定网站在线做h5 的网站
  • 哪个网站教人做美食个人网站可以干什么
  • 购物网站上分期怎么做的深圳电商网站
  • 永久免费素材网站vancl凡客诚品正品
  • 网站建设环境配置计算机网站建设体会
  • 公司网站开发 flask个人信息管理网站建设
  • 苏州建站网站网站建设专业术语
  • 做网站怎么切psd图网站关健词排名
  • 公司企业网站维护永久网站
  • 潍坊在线网站建设wordpress恢复默认
  • 高校建设人事处网站的意义龙之向导外贸网站
  • 网站开发教程云盘网站建设明细价单
  • 建设公司网站多少钱济南网站建设就选搜点网络ok
  • 网站开发 .net网页设计心得体会报告怎么写
  • 浙江建筑公司排名前100在线优化工具
  • 乌克兰网站设计苏州公司网页制作