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

做网站要求手机怎样制作链接

做网站要求,手机怎样制作链接,天元建设集团有限公司年产值,成长厉程网站目录 引言定义旋转方式LL型RR型LR型RL型 实现结构获取结点高度平衡因子更新高度左旋右旋插入结点中序遍历 引言 AVL树,基于二叉搜索树通过平衡得到 前面我们知道,通过🔗二叉搜索树可以便捷快速地查找到数据,但是当序列有序时&am…

目录

  • 引言
  • 定义
  • 旋转方式
    • LL型
    • RR型
    • LR型
    • RL型
  • 实现
    • 结构
    • 获取结点高度
    • 平衡因子
    • 更新高度
    • 左旋
    • 右旋
    • 插入结点
    • 中序遍历

引言

AVL树,基于二叉搜索树通过平衡得到

前面我们知道,通过🔗二叉搜索树可以便捷快速地查找到数据,但是当序列有序时,就会退化成如下图所示的单链表,搜索效率降低为O(N),为了解决这个问题,引出了平衡二叉树(AVL树)

在这里插入图片描述

定义

平衡二叉树,简称AVL树,它可以是一颗空树
如果不是空树,则需要满足 任何一个结点的左子树与右子树高度之差的绝对值不超过1

在这里插入图片描述

图一是AVL树
图二不是AVL树,因为虚线内部分高度差大于1

如何让二叉树变成AVL树呢
答案是通过旋转(左旋、右旋)操作,在说左旋和右旋操作之前,了解一个概念——平衡因子

是否为AVL树需要根据结点的左右子树高度差来判断,所以引出平衡因子的概念
平衡因子:结点左子树高度减去右子树高度
之后我们还可以通过平衡因子来判断需要哪种旋转方式(左旋、右旋)

将二叉树分为四种类型,分别是LL(left)型、RR(right)型、
LR型、RL型
这几种类型是根据引起不平衡的结点的位置来分的,下面将引起不平衡的这个结点叫做unbalanceNode

旋转方式

判断右旋还是左旋,可以这样理解
向哪个方向旋转就是让哪边树更高。比如左旋,就是右子树高于左子树,要想平衡就要让左子树更高一点

LL型

unbalanceNode在根结点左孩子的左子树 – 根结点右旋

如图,插入结点5后导致二叉树失衡,插入的结点5在根结点左孩子14的左子树上,所以就是 LL 型

在这里插入图片描述

LL型二叉树的平衡因子满足:
根结点:2
根结点的左孩子:1(左孩子的左子树高度>右子树)

方法就是将根结点右旋,意思就是将根结点向右旋转到其左孩子的右孩子的位置

在这里插入图片描述

在根结点向右旋转的过程中,因为根结点的左孩子14原本有右孩子20,所以根结点就会和20发生冲突,这时需要将14的右孩子20变成根结点的左孩子

根结点25旋转完成后就是

在这里插入图片描述

再和14相连,最终结果:

在这里插入图片描述


如果出现了多个结点都失衡的情况,如下图
在这里插入图片描述

46、35、24都失衡了,那这时候就不是将根结点右旋了,而是将 与导致失衡的结点(15)最近的失衡结点右旋,在这个例子中也就是将24右旋
在这里插入图片描述

再与35相连,最终结果:
在这里插入图片描述


RR型

unbalanceNode在根结点右孩子的右子树 – 根结点左旋

RR 型与 LL 型方法一致,只是换汤不换药

如图,插入结点67后导致二叉树失衡,插入的结点67在根结点右孩子45的右子树上,所以就是 RR 型

在这里插入图片描述

RR型二叉树的平衡因子满足:
根结点:-2
根结点的左孩子:-1(左孩子的右子树高度>左子树)

方法就是将根结点左旋,意思就是将根结点向左旋转到其右孩子的左孩子的位置
在这里插入图片描述

在根结点向左旋转的过程中,因为根结点的右孩子45原本有左孩子34,所以根结点就会和34发生冲突,这时需要将45的左孩子34变成根结点的右孩子

根结点26旋转完成后就是
在这里插入图片描述

再和45相连,最终结果:
在这里插入图片描述


如果同时出现了多个失衡结点,和 LL 型一样,也是找到与导致失衡结点距离最近的失衡的结点,对该结点进行左旋操作


LR型

unbalanceNode在根结点左孩子的右子树 – 先左旋再右旋(根结点的左孩子左旋,根结点右旋)

如图,插入结点40后导致二叉树失衡,插入的结点40在根结点左孩子25的右子树上,所以就是 LR 型
在这里插入图片描述

LR型的平衡因子满足:
根结点:2
根结点的左孩子:-1(左孩子的右子树高度>左子树)

方法就是

  1. 先将根结点的左孩子左旋
  2. 再将根结点右旋

对于这个二叉树,调整过程:

  1. 将根结点的左孩子左旋
    在这里插入图片描述
  2. 将根结点右旋后
    在这里插入图片描述

RL型

unbalanceNode在根结点右孩子的左子树 – 先右旋再左旋(根结点的右孩子右旋,根结点左旋)

如图,插入结点29后导致二叉树失衡,插入的结点29在根结点右孩子48的左子树上,所以就是 RL 型
在这里插入图片描述

LR型的平衡因子满足:
根结点:-2
根结点的右孩子:1(右孩子的左子树高度>右子树)

方法就是

  1. 先将根结点的右孩子右旋
  2. 再将根结点左旋

对于这个二叉树,调整过程:

  1. 将根结点的右孩子右旋
    在这里插入图片描述

  2. 将根结点左旋
    在这里插入图片描述

实现

结构

结构体中一定包含的是数据data 和左右孩子指针
又因为需要计算平衡因子,所以需要知道左右子树的高度,直接将高度height 包含在结构体中

// 定义树结构
type BTNode struct {data   int //数据left   *BTNoderight  *BTNodeheight int //树的高度
}

获取结点高度

首先判断结点 t 为不为 nil, 为 nil 直接返回0

// 获取结点高度
func (t *BTNode) GetHeight() int {if t == nil {return 0}return t.height
}

平衡因子

平衡因子 = 左子树高度 - 右子树高度
若结点 t 为 nil ,直接返回0

// 计算结点的平衡因子 -- 左子树高度-右子树高度
func (t *BTNode) GetBalanceFactor() int {if t == nil {return 0}return t.left.GetHeight() - t.right.GetHeight()
}

更新高度

在插入或删除数据后,根结点和其他结点的高度都有可能发生变化,所以在插入或删除结点后,需要更新节点的高度,否则在计算平衡因子会出错

// 更新高度
func (t *BTNode) UpdateHeight() {leftHeight := t.left.GetHeight()rightHeight := t.right.GetHeight()if leftHeight > rightHeight {t.height = leftHeight + 1} else {t.height = rightHeight + 1}
}

左旋

对 node 进行左旋 --> node连接在node.right 的左孩子,如果node.right 原本有左孩子leftChild,那让leftChild 连接到node 的右孩子

// 左旋
func (t *BTNode) LeftRotate() *BTNode {//新的根结点变为t的右孩子newT := t.right//判断newT有没有左孩子if newT.left == nil{  //newT原本没有左孩子,t为newt.T左孩子newT.left = t}else { //newT原本有左孩子,原本的左孩子变为t的右孩子,t为newT左孩子t.right = newT.leftnewT.left = t}//更新高度t.UpdateHeight()newT.UpdateHeight()return newT
}

对上面的代码,还可以再简化
如果newT没有左孩子,即为nil,也可以直接赋值给t.right

// 左旋
func (t *BTNode) LeftRotate() *BTNode {//新的根结点变为t的右孩子newT := t.rightt.right = newT.leftnewT.left = t//更新高度t.UpdateHeight()newT.UpdateHeight()return newT
}

右旋

对 node 进行右旋 --> node连接在node.left 的右孩子,如果node.left 原本有右孩子rightChild,那让rightChild 连接到node 的左孩子

// 右旋
func (t *BTNode) RightRotate() *BTNode {newT := t.leftt.left = newT.rightnewT.right = tt.UpdateHeight()newT.UpdateHeight()return newT
}

插入结点

按照二叉搜索树插入数据的方式插入,再根据平衡因子判断是否需要调整和调整的方式

// 插入结点
func (t *BTNode) Insert(data int) *BTNode {if t == nil {return &BTNode{data,nil,nil,1,}}//递归查找插入位置if data < t.data {t.left = t.left.Insert(data)} else if data > t.data {t.right = t.right.Insert(data)} else {return t //不支持重复数据}//更新当前结点的高度t.UpdateHeight()//检查是否需要旋转balance := t.GetBalanceFactor()//左子树高if balance > 1 {if t.left.GetHeight() == 1 { //左孩子的左子树高 -- ll型//右旋return t.RightRotate()}if t.left.GetHeight() == -1 { //左孩子的右子树高 -- lr型//先对左孩子左旋,再对结点右旋t.left.LeftRotate()return t.RightRotate()}}//右子树高if balance < -1 {if t.right.GetHeight() == 1 { //右孩子的右子树高 -- rr型return t.LeftRotate()}if t.right.GetHeight() == -1 { //右孩子的左子树高 -- rl型先对右孩子右旋,再对结点左旋t.right.RightRotate()return t.LeftRotate()}}return t
}

中序遍历

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

文章转载自:

http://h4YrlCkW.Lhwmr.cn
http://fOhrcEKk.Lhwmr.cn
http://q14JwmwI.Lhwmr.cn
http://QAwM5X2c.Lhwmr.cn
http://0nfRy9v3.Lhwmr.cn
http://GSSIvtSS.Lhwmr.cn
http://eLLUhzLQ.Lhwmr.cn
http://LUQcsFXH.Lhwmr.cn
http://ARQh8SnR.Lhwmr.cn
http://szxxI5dY.Lhwmr.cn
http://Hqfm1Ml2.Lhwmr.cn
http://xZnt975F.Lhwmr.cn
http://UauSPwAf.Lhwmr.cn
http://5ZgJL7dK.Lhwmr.cn
http://REWwvyTA.Lhwmr.cn
http://pa84viFX.Lhwmr.cn
http://Wr1fZZhG.Lhwmr.cn
http://5wUCtnms.Lhwmr.cn
http://F9rJ59mQ.Lhwmr.cn
http://Qk3Lp9xt.Lhwmr.cn
http://dV7crKB6.Lhwmr.cn
http://ER4pl0tG.Lhwmr.cn
http://AOwdEc0F.Lhwmr.cn
http://PiVSbK9n.Lhwmr.cn
http://Wn0jka3l.Lhwmr.cn
http://CVg51XF0.Lhwmr.cn
http://dDPLFWIz.Lhwmr.cn
http://jBrvthG8.Lhwmr.cn
http://zxKv0GKp.Lhwmr.cn
http://UWnKZOj5.Lhwmr.cn
http://www.dtcms.com/wzjs/723515.html

相关文章:

  • 2_网站建设的一般步骤包含哪些?哪个网站可以免费做H5
  • 互联网行业信息网站公司网站开发费用兴田德润官方网站
  • 随州网站seo多少钱wordpress本地环境链接404
  • 特产网站模板网站建设人力成本费用
  • 上海网站建设服务分录无法进行网站备案
  • 网站备案变更 能让首页关闭 二级域名继续做网站分为哪几个岗位
  • 没有网站怎样做外贸帮助网站源码
  • 吴中网站开发建设多少钱重庆勘察设计协会网站
  • 管理公司网站建设郑州企业建公租房的政策
  • 福州品牌网站建设oemwordpress上传ftp失败
  • 阿里巴巴网站的功能重庆手机网站制作费用
  • 做淘客网站用备案吗wordpress刷权重插件
  • 北京做网站建设的公司排名wordpress页面和菜单
  • 建筑公司网站设计思路济南网站建设公司川芎网络
  • 嘉兴门户网站php mysql 网站模板
  • 灰色网站网站企业网站开发技术期末试题
  • 建站平台是给谁用的百度推广代理商与总公司的区别
  • 电子商务网站建设与安全网站建设基地
  • 中企动力邮箱手机登录入口湖南企业竞价优化服务
  • 有了域名 怎么做网站查询网网站
  • seo关键词是怎么优化的正规seo关键词排名哪家专业
  • 移动端网站的优点建设工程查询市场价网站
  • 网站内容关键词零售电商平台有哪些
  • 无忧网站建设wordpress 简历 插件
  • 微网站在哪个平台上搭建好 知乎岳阳做网站费用
  • 汕头seo建站如何推广自己
  • 做网站的字体河南郑州建设网站
  • ui设计网站设计与网页制作视频教程网站开发有哪些内容
  • 网站设计语言深圳微信商城网站设计公司
  • 北京做网站哪家好青县网站制作