平衡搜索树中的左单旋右单旋双旋
本文要点:
平衡搜索树的左单旋、右单旋、左右双旋、右左双旋
在平衡搜索树中进行插入结点时,有可能会破坏整棵树的平衡。为了保证平衡不被破坏,就要对一些节点进行旋转,从而来降低树的高度,这样也能保证树的平衡。
一、左单旋:
(上图中的▲结点有可能是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);}
平衡搜索树中的左单旋右单旋双旋相关推荐
- 平衡二叉树(C++) -- 左旋旋右旋旋
平衡二叉树 平衡二叉树(C++) -- 左旋旋右旋旋 平衡二叉树 -- 左单旋 平衡二叉树 -- 右单旋 平衡二叉树 -- 左右双旋 平衡二叉树 -- 右左双旋 平衡二叉树 -- 插入和删除实现 平衡 ...
- 【C++】VAL树的旋转(左单旋、右单旋、双旋)
AVL树的旋转 在将旋转这一块,最好理解的就是图,所以我主要采取图解的方式,来讲述左单旋.右单旋.以及双旋. 在讲VAL树的旋转之前,先来了解一下VAL树的特性. AVL树的特性 AVL树是一个严格平 ...
- LeetCode 510. 二叉搜索树中的中序后继 II(查找右子树或者祖父节点)
文章目录 1. 题目 2. 解题 1. 题目 给定一棵二叉搜索树和其中的一个节点 node ,找到该节点在树中的中序后继. 如果节点没有中序后继,请返回 null . 一个结点 node 的中序后继是 ...
- 二叉树(二):判断是不是二叉搜索树、判断是不是完全二叉树、判断是不是平衡二叉树、二叉搜索树的最近公共祖先、在二叉搜索树中找到两个节点的最近公共祖先、序列化二叉树、重建二叉树、输出二叉树的右视图
目录 一.判断是不是二叉搜索树 1.1 题目 1.2 题解 二.判断是不是完全二叉树 2.1 题目 2.2 题解 三.判断是不是平衡二叉树 3.1 题目 3.2 题解 四.二叉搜索树的最近公共祖先 4 ...
- JeePlus左树右表之 表单【右表】自动获取列表【左树 】中的id
JeePlus 左树右表中表单[右表]自动获取列表[左树 ]中的id 左树右表中表单[右表]和列表[左树 ]中有个关联.新建[右表]的时候每次都需要手动选择[左树 ]中的数据.并进行绑定. 方法: 1 ...
- 平衡二叉树(Java) -- 左旋旋右旋旋
平衡二叉树 平衡二叉树(Java) -- 左旋旋右旋旋 平衡二叉树 -- 代码 平衡二叉树(Java) – 左旋旋右旋旋 平衡二叉树全称平衡二叉搜索树,所以首先具备了二叉搜索树的特性,因为二叉搜索 ...
- leetcode 450. 删除二叉搜索树中的节点 c语言实现
如题: 给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变.返回二叉搜索树(有可能被更新)的根节点的引用. 一般来说,删除节点可 ...
- 74. Leetcode 501. 二叉搜索树中的众数 (二叉搜索树-中序遍历类)
给你一个含重复值的二叉搜索树(BST)的根节点 root ,找出并返回 BST 中的所有 众数(即,出现频率最高的元素).如果树中有不止一个众数,可以按 任意顺序 返回.假定 BST 满足如下定义:结 ...
- 67. Leetcode 450. 删除二叉搜索树中的节点 (二叉搜索树-基本操作类)
给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变.返回二叉搜索树(有可能被更新)的根节点的引用.一般来说,删除节点可分为两个步 ...
最新文章
- AI时代的幕后英雄:谁在生产高质量的AI训练数据?
- NLP学习笔记:word2vec
- Mine Video Player – 视频播放器WordPress插件
- js不区分大小写查找字符串
- 20120510,OSPF第三部分
- 5.软件架构设计:大型网站技术架构与业务架构融合之道 --- 网络
- del/xcopy时如何在输出窗口中,不显示文件名
- Python刚刚尝试就遇:SyntaxError: invalid syntax
- 海豚php框架漏洞,代码审计 - dolphin.pro cms SQL注入漏洞,Bypass过滤规则
- 00. 微服务架构沉思录
- 构建新型现代化智慧博物馆之物联网环境监控方案
- Ruby--如何处理csv文件?
- 分析了网易云数十万歌单后写出2020年的最全歌单推荐
- html1——标题栏logo、网站logo
- Pikachu(皮卡丘)靶场中SQL注入
- java中ioc作用_Spring中的IOC是什么意思,为什么要用IOC而不是New来创建实例?
- 基于Spark的出租车信息查询系统
- 线性代数笔记10——矩阵的LU分解
- 让程序员“#*...%#{4*”的瞬间:你是修电脑的吧?
- ionic2混合应用调起原生地图应用