数据结构与算法问题 AVL二叉平衡树

AVL树是带有平衡条件的二叉查找树。

这个平衡条件必须保持,并且它必须保证树的深度是O(logN)。



一棵AVL树是其每一个节点的左子树和右子树的高度最多差1的二叉查找树。

(空树的高度定义为-1)。


在插入以后。仅仅有那些从插入点到根节点的路径上的节点的平衡可能被改变,由于仅仅有这些节点的子树可能发生变化。当我们沿着这条路径上行到根并更新平衡信息时。我们能够找到一个节点,它的新平衡破坏了AVL条件。我们将指出怎样在第一个这种节点(即最深的节点)又一次平衡这棵树,并证明,这一又一次平衡保证整个树满足AVL特性。



让我们把必须又一次平衡的这个节点叫做a。因为随意节点最多有两个儿子,因此高度不平衡时。a点的两棵子树的高度差2。easy看出,这样的不平衡可能出如今以下四种情况中:

1.对a的左儿子的左子树进行一次插入

2.对a的左儿子的右子树进行一次插入

3.对a的右儿子的左子树进行一次插入

4.对a的右儿子的右子树进行一次插入




第一种情况是插入发生在“外边"的情况(即左—左的情况或右—右的情况)。该情况通过对树的一次单旋转而完毕调整。另外一种情况是插入发生在”内部“的情形(即左—右的情况或右—左的情况),该情况通过略微复杂些的双旋转来处理。

AVL树本质上还是一棵二叉搜索树,它的特点是:



  1. 本身首先是一棵二叉搜索树。

  2. 带有平衡条件:每一个结点的左右子树的高度之差的绝对值(平衡因子)最多为1


#include <iostream>
using namespace std;
const int LH = 1;
const int EH = 0;
const int RH = -1;
bool TRUE = 1;
bool FALSE = 0;typedef struct BSTNode
{int key;int bf;BSTNode *lchild, *rchild;
}BSTNode;//中序遍历
void inordertree(BSTNode * &root)
{if (root){inordertree(root->lchild);cout << root->key<<",";inordertree(root->rchild);}
}//前序遍历
void preordertree(BSTNode * &root)
{if (root){cout << root->key<<",";preordertree(root->lchild);preordertree(root->rchild);}
}
//右旋
void R_Rotate(BSTNode * &p)
{BSTNode *lc = p->lchild;p->lchild = lc->rchild;lc->rchild = p;p = lc;
}//左旋
void L_Rotate(BSTNode *& p)
{BSTNode *rc = p->rchild;p->rchild = rc->lchild;rc->lchild = p;p = rc;
}void LeftBalance(BSTNode * &T)
{BSTNode *lc = T->lchild;switch (lc->bf){case LH:T->bf = lc->bf = EH;R_Rotate(T);break;case RH:BSTNode *rd = lc->rchild;switch (rd->bf){case LH:T->bf = RH;lc->bf = EH;break;case EH:T->bf = lc->bf = EH;lc->bf = LH;break;}rd->bf = EH;L_Rotate(T->lchild);//先左旋R_Rotate(T);break;}
}void RightBalance(BSTNode *& T)
{BSTNode *rc = T->rchild;switch (rc->bf){case RH:T->bf = rc->bf = EH;L_Rotate(T);break;case LH:BSTNode *ld = rc->lchild;switch (ld->bf){case RH:T->bf = LH;rc->bf = EH;break;case EH:T->bf = rc->bf = EH;break;case LH:T->bf = EH;rc->bf = RH;break;}ld->bf = EH;R_Rotate(T->rchild);L_Rotate(T);break;}
}int insertAVL(BSTNode *& t, int e, bool &taller)
{if (!t){t = new BSTNode;t->key = e;t->lchild = t->rchild = NULL;t->bf = EH;taller = TRUE;}else{if (e == t->key){taller = FALSE;return 0;}if (e < t->key){if (!insertAVL(t->lchild, e,taller))return 0;if (taller){switch (t->bf){case LH:LeftBalance(t);taller = FALSE;break;case EH:t->bf = LH;taller = TRUE;break;case RH:t->bf = EH;taller = FALSE;break;}}}else{if (!insertAVL(t->rchild, e, taller))return 0;if (taller){switch (t->bf){case RH:RightBalance(t);taller = FALSE;break;case EH:t->bf = RH;taller = TRUE;break;case LH:t->bf = EH;taller = FALSE;break;}}}}return 1;
}BSTNode *search(BSTNode *t, int key)
{BSTNode *p = t;while (p){if (p->key == key)return p;else if (p->key < key)p = p->rchild;elsep = p->lchild;}return p;
}int main()
{BSTNode *root = NULL;BSTNode *r;bool taller = FALSE;int array[] = { 13, 24, 37, 90, 53 };for (int i = 0; i < 5; i++)insertAVL(root, array[i], taller);cout << "inorder traverse..." << endl;inordertree(root);cout << endl;cout << "preorder traverse..." << endl;preordertree(root);cout << endl;cout << "search key..." << endl;r = search(root, 37);if (r){cout << r->key << endl;}else{cout << "not find" << endl;}system("pause");return 0;
}


转载于:https://www.cnblogs.com/jhcelue/p/6880336.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/252652.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

tomcat源码阅读之StandardHost和StandardEngine

StandardHost及UML类图&#xff1a; 1、StandardHost类是Host接口的默认实现&#xff1b;其继承自ContainerBase类&#xff0c;说明他也是一个容器类&#xff0c;既然是容器类&#xff0c;那肯定也有管道对象PipeLine和阀门&#xff0c;其基础阀门&#xff08;Basic Valve&…

安防监控产业链全景梳理

安防行业是随着现代社会安全需求应运而生的产业&#xff0c;围绕着视频监控技术的改革创新&#xff0c;行业从“看得见、看得远、看得清到看得懂”&#xff0c;一共经历模拟监控、数字监控、网络高清监控和智能监控4个阶段&#xff0c;每一阶段的突破&#xff0c;都由上游技术的…

Vue项目搭建步骤

一&#xff0e; vue-cli初始化1. 全局安装 vue-cli  npm install --global vue-cli2. 创建一个基于 webpack 模板的新项目  vue init webpack my-project3. 安装依赖  cd my-project  npm install (换源安装: npm install --registry https://registry.npm.taobao.org …

Python tutor 简介

Python tutor 能够直观显示object 引用关系。 网址是 http://www.pythontutor.com/visualize.html 先分享一下我的一个Python tutor&#xff1a; 点我出现神奇&#xff1a; 1&#xff09; 编辑code。 2&#xff09; 运行&#xff0c; 能够看到以下界面。 这个工具是很酷的&…

提高CSS性能

1、选择器 了解CSS的查找匹配原理&#xff0c;让CSS更简洁、高效使用高效率的CSS选择器如何使CSS渲染更高效 总结 不要在ID选择器前使用标签名 一般写法&#xff1a;div#divBox 更好写法&#xff1a;#divBox 解释&#xff1a; 因为ID选择器是唯一的&#xff0c;加上div反而增加…

光学镜头行业发展现状及趋势,智能手机应用领域占比最高

一、光学镜头分类 光学镜头也叫摄像镜头或摄影镜头&#xff0c;简称镜头&#xff0c;其功能就是光学成像。光学镜头是光学成像系统中的必备组件&#xff0c;直接影响到成像质量的好坏&#xff0c;影响算法的实现和效果。从结构来看&#xff0c;光学镜头一般由精密五金、塑胶零…

关于_vmvare workstation装32ubuntu的问题

刚开始启动的时候是黑屏&#xff0c;没有任何反应 1.bios也设置BIOS intel virtual technology 设置了enabled(开启硬件虚拟化:要运行一些操作系统&#xff0c;虚拟化软件和虚拟机&#xff0c;硬件虚拟化就需要启用。大多数情况下&#xff0c;不需要虚拟化技术的操作系统可以正…

window screen (获取屏幕信息)

document.write("屏幕宽度"screen.width);document.write("屏幕高度"screen.height);//&#xff08;整个电脑的屏幕的高&#xff09;上面和下面不是有效区的也被包括了 document.write("可用高度"screen.availHeight)//除了上面的任务栏 其他的全…

360°环视(全景影像)系统发展趋势

360环视系统&#xff0c;系统同时采集车辆四周的影像&#xff0c;经过图像处理单元一系列的智能算法处理&#xff0c;最终形成一幅车辆四周的全景俯视图显示在屏幕上&#xff0c;直观地呈现出车辆所处的位置和周边情况。系统大大地拓展了驾驶员对周围和环境的感知能力&#xff…

python简记

Python新手懵懂区&#xff1a; 1.不可变对象是传值&#xff0c;可变对象是传引用 2.不可变对象被真正复制&#xff0c;而可变对象只是复制了一个对它们的引用 3.*args --> 元组型参数传递 **args --> 字典型参数传递 4.浅拷贝&#xff1a;只复制了对对象的引用&#…

需求分析挑战之旅(疯狂的订餐系统)(8)——最后的疯狂

摘要&#xff1a; 说教性质的需求分析理论&#xff0c;各位看了也白看&#xff0c;所以咱们就来一个真实个案——“订餐系统”体验一下。“订餐系统”貌似简单&#xff0c;但陷阱重重&#xff0c;各种需求分析的经典场景将会一一重现&#xff0c;各位做好准备接受这个挑战没有&…

CPU架构:CPU架构详细介绍

1 概述 CPU架构是CPU商给CPU产品定的一个规范&#xff0c;主要目的是为了区分不同类型的CPU。目前市场上的CPU分类主要分有两大阵营&#xff0c;一个是intel、AMD为首的复杂指令集CPU&#xff0c;另一个是以IBM、ARM为首的精简指令集CPU。不同品牌的CPU&#xff0c;其…

【NOIP】关押罪犯

带权并查集&#xff0c;其实这种并查集的核心就是“向量” 1 #include<cstdio>2 #include<iostream>3 #include<algorithm>4 using namespace std;5 int n,m,p[20001],r[20001]; //0表示在同一监狱&#xff0c;1表示在不同监狱 6 struct node{7 int…

数学之路(3)-机器学习(3)-机器学习算法-SVM[7]

SVM是新近出现的强大的数据挖掘工具&#xff0c;它在文本分类、手写文字识别、图像分类、生物序列分析等实际应用中表现出非常好的性能。SVM属于监督学习算法&#xff0c;样本以属性向量的形式提供&#xff0c;所以输入空间是Rn的子集。 图1 如图1所示&#xff0c;SVM的目标是找…

Dalvik指令备忘

跳转指令 if-eq vx, vy, 目标 如果vx vy注2&#xff0c;跳转到目标。if-ne vx,vy, 目标 如果vx ! vy注2&#xff0c;跳转到目标。 if-lt vx,vy, 目标 如果vx < vy注2&#xff0c;跳转到目标。 if-ge vx, vy, 目标 如果vx > vy注2&#xff0c;跳转到目标。 if-gt vx,vy, …

CPU、GPU、FPGA、ASIC等AI芯片特性及对比

1、前言 目前&#xff0c;智能驾驶领域在处理深度学习AI算法方面&#xff0c;主要采用GPU、FPGA 等适合并行计算的通用芯片来实现加速。同时有部分芯片企业开始设计专门用于AI算法的ASIC专用芯片&#xff0c;比如谷歌TPU、地平线BPU等。在智能驾驶产业应用没有大规模兴起和批量…

个人博客03

昨天编写登录界面、注册界面的代码。 今天依旧做这些。 遇到的问题为数据库连接不上。转载于:https://www.cnblogs.com/qilin20/p/8068555.html

人工智能Ai芯片层出不穷,GPU、FPGA、ASIC用于人工智能的优势和劣势对比

人工智能&#xff08;AI&#xff09;主要包括三大要素&#xff0c;分别是数据、算法和算力。其中数据是基础&#xff0c;正是因为在实际应用当中的数据量越来越大&#xff0c;使得传统计算方式和硬件难以满足要求&#xff0c;才催生了AI应用的落地。而算法是连接软件、数据、应…

dom和bom

先看几个两个例题&#xff1a; 星座对应日期&#xff1a; <select id"s1">   <option>a</option>   <option>b</option>   <option>c</option>   <option>d</option>   </select>   <se…

分享自己针对Automation做的两个成熟的框架(QTP 和Selenium)

自己在google code中开源了自己一直以来做的两个自动化的框架&#xff0c;一个是针对QTP的一个是针对Selenium的&#xff0c;显而易见&#xff0c;一个是商业的UI automation工具&#xff0c;一个是开源的自动化工具。 只是代码&#xff0c;可能你直接看的话&#xff0c;有点不…