本文要点:

平衡搜索树的左单旋、右单旋、左右双旋、右左双旋


在平衡搜索树中进行插入结点时,有可能会破坏整棵树的平衡。为了保证平衡不被破坏,就要对一些节点进行旋转,从而来降低树的高度,这样也能保证树的平衡。

一、左单旋:


(上图中的▲结点有可能是NULL,也有可能不为空。。。下同)

从图中可以看出,进行左单旋时,只是改变了parent的右指针以及subR的左指针指向。将subR的左子树(subRL)作为parent的右子树,并让parent作为subR的左子树。很明显,这样做就降低了这棵树的高度。

进行旋转时需要注意的两点:

1.改变subRL->_parent指向时,需要判断subRL是否为NULL,如果为空,就不能对其解引用。

2.parent是否为根节点?如果parent为根节点,那么旋转完成后只需将subR赋给根节点即可;但如果parent不为根节点,即parent是某一节点ppNode的子树,就要判断parent在ppNode的左还是右,这样才能确定subR的位置。

void RotateLeft(Node* parent)    //左单旋{      Node* subR = parent->_right;Node* subRL = subR->_left;parent->_right = subRL;   //先改变parent的右指针if (subRL)   //subRL可能为NULL{subRL->_parent = parent;}Node* ppNode = parent->_parent;subR->_left = parent;parent->_parent = subR;if (ppNode == NULL){_root = subR;subR->_parent = NULL;}else{//判断subR应链接在ppNode的左子树还是右子树if (ppNode->_left == parent)ppNode->_left = subR;elseppNode->_right = subR;subR->_parent = ppNode;}}

二、右单旋:


同左单旋一样,右单旋转是将subL的右子树结点赋给parent的左指针,并让parent自己作为subL的右子树。

 void RotateRight(Node* parent)  //右单旋{Node* subL = parent->_left;Node* subLR = subL->_right;parent->_left = subLR;if (subLR){subLR->_parent = parent;}Node* ppNode = parent->_parent;subL->_right = parent;parent->_parent = subL;if (ppNode == NULL) //说明parent结点为根节点{_root = subL;subL->_parent = NULL;}else{//如果parent不为根节点,判断其在上一个结点的右还是左if (ppNode->_left == parent)ppNode->_left = subL;elseppNode->_right = subL;subL->_parent = ppNode;}}

三、左右双旋:

了解了单旋之后,双旋就比较简单,只是进行了两步单旋而已

void RotateLR(Node* parent)      //左右双旋{RotateLeft(parent->_left);RotateRight(parent);}

四、右左双旋:


 void RotateRL(Node* parent)     //右左双旋{RotateRight(parent->_right);RotateLeft(parent);}

平衡搜索树中的左单旋右单旋双旋相关推荐

  1. 平衡二叉树(C++) -- 左旋旋右旋旋

    平衡二叉树 平衡二叉树(C++) -- 左旋旋右旋旋 平衡二叉树 -- 左单旋 平衡二叉树 -- 右单旋 平衡二叉树 -- 左右双旋 平衡二叉树 -- 右左双旋 平衡二叉树 -- 插入和删除实现 平衡 ...

  2. 【C++】VAL树的旋转(左单旋、右单旋、双旋)

    AVL树的旋转 在将旋转这一块,最好理解的就是图,所以我主要采取图解的方式,来讲述左单旋.右单旋.以及双旋. 在讲VAL树的旋转之前,先来了解一下VAL树的特性. AVL树的特性 AVL树是一个严格平 ...

  3. LeetCode 510. 二叉搜索树中的中序后继 II(查找右子树或者祖父节点)

    文章目录 1. 题目 2. 解题 1. 题目 给定一棵二叉搜索树和其中的一个节点 node ,找到该节点在树中的中序后继. 如果节点没有中序后继,请返回 null . 一个结点 node 的中序后继是 ...

  4. 二叉树(二):判断是不是二叉搜索树、判断是不是完全二叉树、判断是不是平衡二叉树、二叉搜索树的最近公共祖先、在二叉搜索树中找到两个节点的最近公共祖先、序列化二叉树、重建二叉树、输出二叉树的右视图

    目录 一.判断是不是二叉搜索树 1.1 题目 1.2 题解 二.判断是不是完全二叉树 2.1 题目 2.2 题解 三.判断是不是平衡二叉树 3.1 题目 3.2 题解 四.二叉搜索树的最近公共祖先 4 ...

  5. JeePlus左树右表之 表单【右表】自动获取列表【左树 】中的id

    JeePlus 左树右表中表单[右表]自动获取列表[左树 ]中的id 左树右表中表单[右表]和列表[左树 ]中有个关联.新建[右表]的时候每次都需要手动选择[左树 ]中的数据.并进行绑定. 方法: 1 ...

  6. 平衡二叉树(Java) -- 左旋旋右旋旋

    平衡二叉树 平衡二叉树(Java) -- 左旋旋右旋旋 平衡二叉树 -- 代码 平衡二叉树(Java) – 左旋旋右旋旋   平衡二叉树全称平衡二叉搜索树,所以首先具备了二叉搜索树的特性,因为二叉搜索 ...

  7. leetcode 450. 删除二叉搜索树中的节点 c语言实现

    如题: 给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变.返回二叉搜索树(有可能被更新)的根节点的引用. 一般来说,删除节点可 ...

  8. 74. Leetcode 501. 二叉搜索树中的众数 (二叉搜索树-中序遍历类)

    给你一个含重复值的二叉搜索树(BST)的根节点 root ,找出并返回 BST 中的所有 众数(即,出现频率最高的元素).如果树中有不止一个众数,可以按 任意顺序 返回.假定 BST 满足如下定义:结 ...

  9. 67. Leetcode 450. 删除二叉搜索树中的节点 (二叉搜索树-基本操作类)

    给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变.返回二叉搜索树(有可能被更新)的根节点的引用.一般来说,删除节点可分为两个步 ...

最新文章

  1. AI时代的幕后英雄:谁在生产高质量的AI训练数据?
  2. NLP学习笔记:word2vec
  3. Mine Video Player – 视频播放器WordPress插件
  4. js不区分大小写查找字符串
  5. 20120510,OSPF第三部分
  6. 5.软件架构设计:大型网站技术架构与业务架构融合之道 --- 网络
  7. del/xcopy时如何在输出窗口中,不显示文件名
  8. Python刚刚尝试就遇:SyntaxError: invalid syntax
  9. 海豚php框架漏洞,代码审计 - dolphin.pro cms SQL注入漏洞,Bypass过滤规则
  10. 00. 微服务架构沉思录
  11. 构建新型现代化智慧博物馆之物联网环境监控方案
  12. Ruby--如何处理csv文件?
  13. 分析了网易云数十万歌单后写出2020年的最全歌单推荐
  14. html1——标题栏logo、网站logo
  15. Pikachu(皮卡丘)靶场中SQL注入
  16. java中ioc作用_Spring中的IOC是什么意思,为什么要用IOC而不是New来创建实例?
  17. 基于Spark的出租车信息查询系统
  18. 线性代数笔记10——矩阵的LU分解
  19. 让程序员“#*...%#{4*”的瞬间:你是修电脑的吧?
  20. ionic2混合应用调起原生地图应用

热门文章

  1. Tech Talk 宣传 | 如何高效、极简构造无服务器 Web 应用
  2. zabbix 内存溢出 解决
  3. 平面设计需要学习的软件
  4. 手绘风格的白板Excalidraw
  5. 【Java设计模式】——单例模式
  6. 为什么要做售后五星服务认证?
  7. python+matplotlib绘制南丁格尔玫瑰图
  8. 如何在Java中写模糊查询
  9. Mac OSX: 有线共享WiFi
  10. 软件测试工程师职业规划