--html点击网页任意位置跳转到新链接的代码--> 这个网址http://qzy178.com/ 换回你要跳转页面的网址 window.onclick = function()...--html点击网页任意位置跳转到新链接并保留原网页的代码--> 这个网址http://qzy178.com/ 换回你要跳转页面的网址
旋转原理 通过右旋,可以将失衡的左子树提升到当前节点的根节点位置,将当前节点向右旋转,形成新的平衡状态。...旋转原理 通过左旋,可以将失衡的右子树提升到当前节点的根节点位置,将当前节点向左旋转,形成新的平衡状态。...平衡因子更新 在插入节点后,从插入位置沿着路径向上更新每个祖先节点的平衡因子: 如果插入在左子树:parent->_bf--,平衡因子减1。...解决:需要进行左右双旋(RotateLR),即先对左子树进行左旋,再对当前节点进行右旋。...解决:需要进行右左双旋(RotateRL),即先对右子树进行右旋,再对当前节点进行左旋。
每次对伸展树进行操作后,它均会通过旋转的方法把被访问节点旋转到树根的位置。...我们仍然从底部向上沿着访问路径旋转。 令X是在访问路径上的一个非根节点,我们将在这个路径上实施旋转操作。如果X的父节点是根节点,那么我们只需要旋转X和树根。...情况一:之字型(zig-zag) 也就是AVL树里那俩要双旋的。 情况二:一字型(zig-zig) 也就是AVL树里那俩只需要单旋的。...我一直没看懂的示例 下面是一个查找节点19的例子: 在例子中,树中并没有节点19,最后,距离节点最近的节点18被旋转到了根作为新的根。...节点20也是距离节点19最近的节点,但是节点20没有成为新根,这和节点20在原来树中的位置有关系。 而一直困扰我的,就是第二步到第三步的转化,为什么要把20提上去,现在明白了。
根据节点插入位置的不同,AVL树的旋转分为四种: 新节点插入较高左子树的左侧---左左:右单旋...新节点插入较高左子树的右侧---左右:先左单旋再右单旋 新节点插入较高右子树的左侧---右左:先右单旋再左单旋 右单旋: 将失衡结点进行右旋即可,从操作上来说就是将b变成60的左边、60变成30的右边、...将失衡结点向左旋转即可,从操作上来说就是b变成30的右边、30变成60的左边、60变成当前树的根三个步骤。...首先讲讲单旋和双旋的区分,只需要旋转一次的单旋是因为无论是左单旋还是右单旋,新增的结点都是在同一边的,从失衡结点的平衡因子的正负来看,都是同正或者同负的!...而之所以要双旋是因为,插入的新节点和原先并不在同一边,从失衡结点的平衡因子的正负来看,都是一个为正,一个为负,所以需要先旋转一次,变为同一边,接着再重复单旋的过程!
的数量 2.2、插入流程 红黑树 的插入流程也和 二叉搜索树 基本一致,先找到合适的位置,然后插入新节点,当节点插入后,需要对颜色进行判断,看看是否需要进行调整 插入流程: 判断根是否为空,如果为空,...则进行第一次插入,成功后返回 true 找到合适的位置进行插入,如果待插入的值比当前节点值大,则往 右 路走,如果比当前节点值小,则往 左 路走 判断父节点与新节点的大小关系,根据情况判断链接至 左边...,然后向上走,继续判断是否需要调整 如果 父亲为红 并且 叔叔为黑 或者 叔叔不存在,此时需要 旋转 + 染色,根据当前节点与父亲的位置关系,选择 单旋 或 双旋,值得一提的是 旋转 + 染色 后,不必再向上判断...“父亲为红,叔叔也为红,直接染色即可” 当 单次染色 结束后,更新 cur 至 grandfather 的位置,并同步更新 parent,继续判断是需要进行 单纯染色、单旋 + 染色 还是 双旋 +...u 表示叔叔节点,g 表示祖父节点 双旋 其实就是两个不同的 单旋,不过对象不同而已,先 右旋转 parent,再 左旋转 grandfather 就是 右左双旋 本质:将 cur 的右孩子托付给 parent
AVL树中的每个节点都能保证左子树中的所有节点小于当前节点的关键字,右子树中的所有节点大于当前节点的关键字。...因为左边比右边高,需要旋转到右边.使其平衡. (1) 右旋具体图: 关键步骤: 使cur成为新的父节点 cur的右孩子,成为parent的左孩子 parent成为cur的右孩子 (2)右旋抽象图...: 更新平衡因子: 从抽象图可以看出,右旋旋转后,平衡因子cur parent都可以无脑设置为0....因为右边比左边高,需要旋转到左边,使其平衡. (1)左旋具体图: 关键步骤: 使cur成为新的父节点 cur的左孩子,成为parent的右孩子 parent成为cur的左孩子 (2)左旋抽象图...更新平衡因子: 从抽象图可以看出,左旋旋转后,平衡因子cur parent都可以无脑设置为0.
待插入结点的key值比当前结点小就插入到该结点的左子树 待插入结点的key值比当前结点大就插入到该结点的右子树 待插入结点的key值与当前结点的key值相等就插入失败 示例:插入12 插入后则向上调整当前结点到根路径上祖先结点的平衡因子...,但是插入的位置是空节点,需要另一个指针记录父结点 Node* cur = _root, *parent = _root; while (cur) { if (cur...,可能造成不平衡,此时必须调整树的结构,使之平衡 根据节点插入位置的不同,AVL树的旋转分为四种: 新节点插入较高右子树的右侧—右右:左单旋 1、左单旋 抽象示图: 注意: 上图在插入前AVL...) 复用单旋会把其他情况都给处理,例如子树是否为空,当前不平衡结点为根结点还是子树结点 对于h高度的子树,h满足大于等于0,当h=0时,插入新节点就是60 左右双旋可以看做是60做当前树的根结点...当SubL的平衡因子为1时,执行左右双旋 从视角上来看,当旋转相关结点成直线,则进行单旋;当旋转相关结点成折线,则进行双旋 旋转完成后,原pParent为根的子树个高度降低,已经平衡
不过 AVL 树在链接之后,需要对 平衡因子 进行更新,并判断是否需要进行 旋转 以调整高度 插入流程: 判断根是否为空,如果为空,则进行第一次插入,成功后返回 true 找到合适的位置进行插入,如果待插入的值比当前节点值大...,则往 右 路走,如果比当前节点值小,则往 左 路走 判断父节点与新节点的大小关系,根据情况判断链接至 左边 还是 右边 更新平衡因子,然后判断是否需要进行 旋转 调整高度 代码片段如下(不包括判断 旋转...时,则可能引发 双旋 比如 插入右子树的左侧 时,单单凭借 左单旋 无法解决问题,需要 先进行 右单旋,再进行 左单旋 才能 降低高度,这一过程就成为 双旋(右左双旋) 代码实现很简单,根据不同的位置调用...,不能写成 赋值 = 当前 AVL 树为 三叉链 结构,在调整左右子树链接关系时,也需要对 父指针 进行调整 单旋转后,涉事节点的平衡因子都为 0 双旋转后,涉事节点的平衡因子需要分类讨论 AVL 的操作较多...稍微有点退化的趋势,都要被旋转调整,这样做的好处是 严格控制了查询的时间,查询速度极快,约为 logN 但是过度苛刻也会带来一定的负面影响,比如涉及一些 结构修改 的操作时,性能非常低下,更差的是在 删除 时,因为从任意位置破坏了
在2.3的插入中,我们说到了一旦平衡因子超出了指定的范围就会导致子树左右高度差发生变化,导致结构不再是高度平衡的状态,此时这个子树就需要旋转,旋转到没插入前的高度。...根据节点插入位置的不同,AVL树的旋转根据不同的插入情况分为四种:左单旋、右单旋、先左单旋再右单旋、先右单旋再左单旋。上面的例子就属于左单旋。 注:插入的节点名字为cur。...那为什么会左旋,从抽象的角度来看,对于高度平衡的AVL树,右边过高,我们就需要考虑不让右面高,从绳子的角度来说,右边过长,那就将中间节点再往右移动,对于这个模型也一样,我们考虑根节点往右移动,即将60作为根节点...最后这个子树的新根的parent指针再连接回去。需要注意的细节问题是节点的parent指针。...3.3 左右双旋 新节点插入较高左子树的右侧—左右:先左单旋再右单旋 就如上面的抽象图,我们仍然需要对其有所见解才能进一步分析并写出代码,通过观察发现对具象的三个节点,原本是折线,通过左旋变成直线后,
一、栈解旋 1、栈解旋引入 C++ 程序 抛出异常后 对 局部变量的处理 : 当 C++ 应用程序 在 运行过程 中发生异常时 , 程序会跳转到异常处理程序 , 并执行一些操作以处理异常 ; 在这个过程中..., C++ 会自动处理函数调用的堆栈 , 并释放局部变量和对象等资源 ; 上述操作就是 " 栈解旋 " ; 2、栈解旋概念 C++ 语言 中的 栈解旋 ( Stack Unwinding ) 是指 在程序发生异常时..., 系统从当前的函数开始逐层返回 , 释放每个函数中的局部变量 , 直到回到主函数 main 函数中 , 同时执行异常处理程序 , 上述完整过程称为 " 栈解旋 " ; 在 try 语句块中 , 在..., 所有在 函数栈 中创建的对象 或 数据 , 都会被自动析构 , 析构的顺序 与 创建顺序 相反 ; 3、栈解旋作用 " 栈解旋 " 的 作用是确保程序在异常发生时能够安全退出 , 并释放占用的资源..., 抛出异常后 , 首先进行 栈解旋操作 , 释放 fun 函数中的 Student 对象 , 然后进入 catch 分支处理异常 ; 调用构造函数 开始抛出 char 类型 异常 调用析构函数
也可能因为经过某些插入或删除的操作,导致其失去平衡退化为单支树并导致搜索效率降低的情况, 如下不平衡搜索树: 可以发现,如果搜索二叉树退化到这样极端的不平衡状态,其搜索效率就会大大降低, 时间复杂度会从...9的右孩子位置, 右单旋示意图如下: 经过右单旋操作之后,我们得到的AVL树就又重新满足平衡二叉搜索树了: 接下来我们继续插入新结点17:...AVL树的根节点11和其右孩子14都失衡了.这个时候我们只需要调整距离新插入结点最近的失衡结点即可,调整完这个最近失衡结点之后,其余的祖先失衡结点会自动恢复平衡的。...: 将失衡结点右孩子的左子树链接到失衡结点的右孩子的位置 将失衡结点链接到失衡结点右孩子的左孩子位置 所以我们下面采取左单旋的方式使AVL树重新平衡, 先将失衡结点14的右孩子17...的右子树16链接到失衡结点14的右孩子的位置,再将失衡结点14链接到失衡结点右孩子17的左孩子位置, 左单旋示意图如下: 经过左单旋操作之后,我们得到的AVL树就完成了所有的插入操作并满足平衡二叉搜索树了
值 > 当前位置的key值,往右子树走 插入的节点key值 当前位置的key值,往左子树走 插入的节点key值等于当前位置的key值,不能插入,返回false 插入之后,与二叉搜索树不同的是:我们还需要去进行平衡因子的更新...: 如果parent的平衡因子是2,cur的平衡因子是1时,说明右边的右边比较高,我们需要进行左单旋 如果parent的平衡因子是-2,cur的平衡因子是-1时,说明左边的左边比较高,我们需要进行右单旋...新节点插入较高左子树的右侧—左右:先左单旋再右单旋 a/d是高度为h的AVL树,b/c是高度为h-1的AVL树。...为轴点进行右旋,在进行平衡因子的更新(最大的问题) 我们从总体的角度来看,左右双旋的结果就是:就是把subLR的左子树和右子树,分别作为subL和parent的右子树和左子树,同时subL和parent...新节点插入较高右子树的左侧—右左:先右单旋再左单旋 插入 subR为轴点进行右单旋: parent为轴进行左单旋: 既右左双旋: 右左双旋后,根据subRL 初始平衡因子的不同分为三种情况分别对应
3——h=2 ---- 对于c来说,必定是x形状 假设c为y形状 在左子树新插入一个节点,那这颗子树的平衡因子变为-2,需要旋转,而不会去往上更新到30 ---- 若右子树插入一个节点,parent...的高度变化,必定引发旋转 ---- 在红框中的四个位置任意一边插入,30的平衡因子都会变为2/-2 虽然分为三种情况,但是旋转的规则是相同 左单旋 以h=1为例 左单旋的旋转方式: 把B变成30的右边...,父节点置NULL,subR作为新的根 ---- 右单旋 在a处新增节点,使其高度变为h+1,造成旋转 右单旋的旋转方式: b作为60的左边,60作为30的右边,30变成整棵树的根 右单旋h与左单旋一样...将60进行右旋:60作为整棵树新的根 将60的右子树作为90的左子树,将90作为60的右子树 ---- 假设在c的右子树插入新增节点 新增节点插入在b和c节点,各个位置的平衡因子是不一样的 ----...6的高度差为2 所以还要判断子树是否符合平衡树 ---- 若平衡因子异常,虽然在当前判断平衡树是没有影响的,但是在后续插入判断时,使不该旋转的进行旋转了 所以需要判断下当前root的平衡因子是否与左右子树高度差相等
按二叉搜索树规则进行插入,红黑树首先是一个二叉搜索树(BST),因此,插入一个新值的第一步就是根据BST的规则查找插入位置: 如果插入的值小于当前节点的值,则向左子树移动。...抽象图 情况3:双旋+变色 在红黑树的插入过程中,当新插入的节点 c 和其父节点 p 都是红色,而 p 的兄弟节点 u(叔叔节点)不存在或是黑色时,若 c 和 p 处于特定位置关系,无法通过单次旋转解决平衡问题...双旋和变色的分析: 在双旋中,我们首先会对 p 进行一次旋转,使 c 成为新的父节点;然后对 g 进行一次旋转,让 p 或 c 成为新的子树根节点。...步骤3:判断 p 和 c 的位置关系 根据 p 和 c 在 g 中的位置,可以确定是需要单旋还是双旋: 如果 c 是 p 的右子节点,而 p 是 g 的左子节点,则发生LR 失衡,需要进行双旋。...如果 c 是 p 的左子节点,而 p 是 g 的右子节点,则发生RL 失衡,也需要进行双旋。 步骤4:执行双旋操作 对于 LR 失衡,先对 p 进行左旋,再对 g 进行右旋,让 c 成为新的根节点。
),插入后被更新成正负1,此时以pParent为根的树的高度增加,需要继续向上更新,如下图所示: AVL树插入新节点90之后,pParent也就是80节点的平衡因子就需要更新为1,继续往上更新,直到60...如果更新后pParent的平衡因子为正负2,则pParent的平衡因子违反平衡树的性质,需要对其进行旋转处理,如上图所示 所以对于AVL树插入新节点来说,我们需要更新插入后由于左右子树高度差改变带来的新的平衡因子...根据节点插入位置的不同,AVL树的旋转分为四种:那么我们具体来看看AVL树旋转的实现: ✨左单旋 新节点插入较高右子树的右侧—右右:左单旋 parent和cur的平衡因子经过旋转之后变为0,维持了...,与选b的区别在于平衡因子的不同,这里可以根据具体选择分析出来,所以在双旋之后记得根据不同的插入位置更新不同的平衡因子。...新节点插入较高左子树的右侧—左右:先左单旋再右单旋,借助上面实现的右单旋和左单旋即可 如下图所示,左右双旋与右左双旋类似,也可以插入在下图中的b或从,旋转方式一样,不影响,就是最后平衡因子需要根据插入的位置更新
在a子树中插入一个新结点,导致a子树的高度从h变成h+1,不断向上更新平衡因子,导致10的平衡因子从-1变成-2,10为根的树左右高度差超过1,违反平衡规则。...在a子树中插入一个新结点,导致a子树的高度从h变成h+1,不断向上更新平衡因子,导致10的平衡因子从1变成2,10为根的树左右高度差超过1,违反平衡规则。...通过图7和图8可以看到,左边高时,如果插入位置不是在a子树,而是插入在b子树,b子树高度从h变成h+1,引发旋转,右单旋无法解决问题,右单旋后,我们的树依旧不平衡。...1的e和f子树,因为我们要对b的父亲5为旋转点进行左单旋,左单旋需要动b树中的左子树。...有兴趣可参考:《殷人昆 数据结构:用面向对象方法与C++语言描述》中讲解。
基本步骤: 查找插入位置: 首先,我们需要找到新节点应该插入的位置。...从根节点开始,按照二叉搜索树的性质,逐级向左或向右比较键值,直到找到一个合适的位置。 插入新节点: 找到插入位置后,我们创建一个新的节点,颜色为红,并将其插入到树中。...如果树为空,则新节点成为树的根节点。否则,将新节点插入到合适的位置,使得树仍然保持二叉搜索树的性质。...插入后有需要变化时情况很多,下面具体分析 因为新节点的默认颜色是红色,因此:如果其双亲节点的颜色是黑色,没有违反红黑树任何性质,则不需要调整;但当新插入节点的双亲节点颜色为红色时,就违反了性质三不能有连在一起的红色节点...将当前节点指向祖父节点,并将祖父节点设为当前节点的父节点(开始向上走)。
需要记住的是:红黑树每条路径(从根节点到空节点)上的黑色节点数量相同。 红黑树的应用场景十分广泛,其中之一是在很多高性能的C++ STL库中被广泛采用,比如map和set。...} 寻找到合适的位置可以进行插入了,这里要进行一个思考:新插入的节点是什么颜色???...我们来分类讨论一下: 新插入黑色节点:如果我们新插入一个黑色节点,那么毋庸置疑会违反规则4 :对于任意一个节点,从该节点到其所有后代叶子节点的简单路径上,必须包含相同数目的黑色节点。...我们只需要对父节点是红色进行处理了,为了保证满足规则4:对于任意一个节点,从该节点到其所有后代叶子节点的简单路径上,必须包含相同数目的黑色节点。...这里我们简单讲解一下右单旋: 右单旋的情况是:父节点是红色,叔叔节点是黑色 , 插入的位置是父节点的左边。这是就要对爷爷节点进行右单旋。
奉献教育(店铺)【奉献教育】知识店铺 图1-3:FANUC 0i Mate-MC数控系统编辑面板 表1-1 FANUC 0i Mate-MC数控系统主菜单功能键的符号和用途 序号键符号按键名称用途1 位置键荧屏显示当前位置画面...图2-1 FANUC 0i Mate-MC数控系统回零操作 机床回零操作应注意以下几点: (1)当机床工作台或主轴当前位置接近机床零点或处于超程状态时,此时应采用手动模式,将机床工作台或主轴移至各轴行程中间位置...按刀偏设定键——按软键【(补正)】,出现如图2-2a所示画面——按光标移动键,将光标移至需要设定刀补的相应位置(如图2-2a光标停在D01位置)——输入补偿量(如图2-2a输入刀补值6.1)——按输入键...)——按删除键即删除从No xxxx-No yyyy之间的程序。...十、MDI操作 1.有时加工比较简单的零件或只需要加工几个程序段,往往不编写程序输入到内存中,而采取用在MDI方式边输入边加工的操作。 2.把“MODE SELECT”旋钮旋至“MDI”进入。
领取专属 10元无门槛券
手把手带您无忧上云