平衡二叉树【学习笔记】
一、引文
二叉搜索树的查找效率取决于平均搜索长度,而这又取决去树的形状。当二叉搜索树退化为一个链表时,查找效率非常低。理想的形状是任何结点的左右子树的高度最多相差1,而这样的二叉树我们也称之位平衡二叉树。
二、分析
平衡二叉树的最核心的地方就在于四种旋转情况
左左情况:右旋
即相对根结点的左子树的高度比右子树高2,且插入的点为左子树的左孩子,不满足条件,所以右旋。
左右情况:先左再右
但如果插入的数是3,如果再只右旋,就会发现有问题,所以这里需要先以2为根结点左旋再以4为根结点右旋。
右右情况:左旋
即相对根节点的右子树的高度比左子树高2,且插入的点为右子树的右孩子,不满足条件,所以左旋
右左情况:先右再左
如果插入的为5,那么如果只左旋也会出现问题,所以先右旋再左旋。
三、具体代码实现
1 #ifndef AVL_H 2 #define AVL_H 3 4 using namespace std; 5 6 template<class T> 7 class AvlTree 8 { 9 private: 10 typedef struct AvlNode 11 { 12 T data; //数据 13 int height; //结点深度 14 struct AvlNode *lchild, *rchild; //左右孩子 15 AvlNode(const T &item):data(item),height(0),lchild(NULL),rchild(NULL){} 16 }AvlNode; 17 AvlNode *Root; 18 int size; 19 void R_Rotate(AvlNode * &root); //右旋 20 void L_Rotate(AvlNode * &root); //左旋 21 void LR_Rotate(AvlNode * &root); //先左再右 22 void RL_Rotate(AvlNode * &root); //先右再左 23 int Height(AvlNode * &root){ return (root == NULL?-1:root->height);}; //-1是因为根的深度为0 24 void Print(AvlNode * root); 25 public: 26 AvlTree(void):Root(NULL),size(0){}; 27 ~AvlTree(void){Clear(Root); size = 0;}; 28 void Insert(const T &x, AvlNode * &root); 29 void Insert(const T&x){Insert(x, Root);}; 30 int Size(){return size;}; 31 void Clear(AvlNode *&root); 32 void Print(){Print(Root);puts("");}; 33 34 }; 35 36 template<class T> 37 void AvlTree<T>::R_Rotate(AvlNode * &root) 38 { 39 AvlNode *p = NULL; 40 p = root->lchild; 41 root->lchild = p->rchild; 42 p->rchild = root; 43 root->height = max(Height(root->lchild), Height(root->rchild)) + 1; 44 p->height = max(Height(p->lchild), Height(p->rchild)) + 1; 45 root = p; 46 } 47 template<class T> 48 void AvlTree<T>::L_Rotate(AvlNode * &root) 49 { 50 AvlNode *p = NULL; 51 p = root->rchild; 52 root->rchild = p->lchild; 53 p->lchild = root; 54 root->height = max(Height(root->lchild), Height(root->rchild)) + 1; 55 p->height = max(Height(p->lchild), Height(p->rchild)) + 1; 56 root = p; 57 } 58 template<class T> 59 void AvlTree<T>::LR_Rotate(AvlNode * &root) 60 { 61 L_Rotate(root->lchild); 62 R_Rotate(root); 63 } 64 template<class T> 65 void AvlTree<T>::RL_Rotate(AvlNode * &root) 66 { 67 R_Rotate(root->rchild); 68 L_Rotate(root); 69 } 70 template<class T> 71 void AvlTree<T>::Insert(const T &x, AvlNode * &root) 72 { 73 if(root == NULL) 74 { 75 root = new AvlNode(x); 76 size++; 77 return; 78 } 79 else if(x < root->data) 80 { 81 Insert(x, root->lchild); 82 if(Height(root->lchild) - Height(root->rchild) == 2) 83 { 84 if(x < root->lchild->data) 85 R_Rotate(root); 86 else 87 LR_Rotate(root); 88 } 89 } 90 else if(x > root->data) 91 { 92 Insert(x, root->rchild); 93 if(Height(root->rchild) - Height(root->lchild) == 2) 94 { 95 if(x > root->rchild->data) 96 L_Rotate(root); 97 else 98 RL_Rotate(root); 99 } 100 } 101 root->height = max(Height(root->lchild), Height(root->rchild) ) + 1; 102 103 } 104 105 template<class T> 106 void AvlTree<T>::Clear(AvlNode * &root) 107 { 108 if(root == NULL) 109 return; 110 Clear(root->rchild); 111 Clear(root->lchild); 112 delete root; 113 root = NULL; 114 } 115 116 #endif
View Code
转载于:https://www.cnblogs.com/dybala21/p/10665020.html
平衡二叉树【学习笔记】相关推荐
- sheng的学习笔记-平衡二叉树(AVL)和3+4重构
二叉树细节可参考: sheng的学习笔记-二叉树(BST)_coldstarry的博客-CSDN博客 定义 平衡二叉树,又称AVL树,用于解决二叉排序树高度不确定的情况,如果二叉排序树的子树间的高度相 ...
- K-D Tree 学习笔记
K-D Tree 学习笔记 最近看了一下k-NN然后它说如果特征空间维数比较低的时候用K-D Tree来求k近邻比较快所以就来补一下学OI时没学的K-D Tree假装写一个学习笔记吧. 是什么? 是一 ...
- Java 基础 第3阶段:高级应用——尚硅谷学习笔记(含面试题) 2023年
Java 基础 第 3 阶段:高级应用--尚硅谷学习笔记(含面试题) 2023 年 Java 基础 第 3 阶段:高级应用--尚硅谷学习笔记(含面试题) 2023 年 第 9 章 异常处理 9.1 异 ...
- 【软考中级】软件设计师学习笔记
软件设计师学习笔记 计算机系统知识 程序语言设计 数据结构 操作系统 软件工程基础知识 结构化开发方法 创建型设计模式 行为型设计模式 结构型设计模式: 算法设计与分析 数据库技术基础 网络与信息安全 ...
- 《计算几何》学习笔记
前言 这是学堂在线邓老师讲的<计算几何>课程的学习笔记.实际上很多细节,比如点重合.边平行等特殊情况,在课程中没有进行考虑,课程讲的算法只考虑一般性的情况. (最后两章Geometric ...
- MySQL实战45讲学习笔记
文章目录 MySQL实战45讲-学习笔记 01 基础架构:一条SQL查询语句是如何执行的? mysql逻辑架构 连接器 查询缓存 分析器 优化器 执行器 02 日志系统:一条SQL更新语句如何执行 r ...
- 【算法竞赛学习笔记】pb_ds-超好懂的数据结构
title : pb_ds date : 2021-8-21 tags : ACM,数据结构 author : Linno 简介 pb_ds库全称Policy-Based Data Structure ...
- 数据结构学习笔记(王道)
数据结构学习笔记(王道) PS:本文章部分内容参考自王道考研数据结构笔记 文章目录 数据结构学习笔记(王道) 一.绪论 1.1. 数据结构 1.2. 算法 1.2.1. 算法的基本概念 1.2.2. ...
- MySQL 学习笔记②
若文章内容或图片失效,请留言反馈.部分素材来自网络,若不小心影响到您的利益,请联系博主删除. 视频链接:https://www.bilibili.com/video/BV1Kr4y1i7ru 资料链接 ...
- 算法学习 (门徒计划)2-1 二叉树(Binary-Tree)与经典问题 学习笔记
算法学习 (门徒计划)2-1 二叉树(Binary-Tree)与经典问题 学习笔记 前言 树与二叉树 树的基本概念 链表是特殊的树 树是特殊的图 二叉树的基本概念 完全二叉树 完全二叉树的意义 完美二 ...
最新文章
- Windows Server 2008 R2之三十二:证书注册WEB服务(一)
- ORACLE SQL开发where子句之case-when
- poj(百练) 2743解题报告
- 脚本类恶意程序分析技巧汇总
- golang文件操作:打开关闭文件,带缓冲区的读文件
- 【软考-软件设计师】校验码
- 憎恨之心最强套装攻略_冰雪攻略来袭,打金人不用慌
- 天猫精灵方糖拆解报告和芯片详解
- LeetCode 2071. 你可以安排的最多任务数目(二分查找)
- python getattr和getattribute_详解Python中 __get__和__getattr__和__getattribute__的区别
- Testin云測试破7000万次:崩溃成90%手游应用质量难题
- TP5.x——update更新成功但是返回是0
- Android-Universal-Image-Loader学习笔记(一)
- 互联⽹名词⼤全——商业模式篇
- 确定你的台式计算机支持的内存类型,如何区分内存类型及查看内存的兼容性
- 爱和感恩2021年末记
- 谷歌退出中国谁对谁错
- 中国七夕情人节快到了2009
- 关于华三HCL使用时,设备端口状态为down的解决
- NO.54——基于scrapy的P站爬虫
热门文章
- python框架flask_Python开发框架Flask-阿里云开发者社区
- stats | 使用(偏)自相关函数判断ARMA模型的阶数
- mysql的递归查询_比较两种mysql递归tree查询效率-mysql递归tree
- 自学前端真的没有前途吗?
- 如何深入的学习好CSS?
- 8年web前端开程序媛,告诉你如何零基础学习web前端
- 客户端序列码生成_Django REST Framework教程(2): 序列化器介绍及开发基于函数视图的API...
- php内嵌网页加载js,javascript 窗口加载蒙板 内嵌网页内容_javascript技巧
- mysql觸發器_mysql觸發器
- php 付款,php – 接受付款最佳做法