数据结构与算法分析(七)——C++实现平衡二叉树
平衡二叉树的概念
概念:
1.每个节点的左子树和右子树的高度最多差1的二叉查找树
操作时的注意事项:
每一次的插入可能会破坏平衡条件,故需要对节点进行平衡性判断然后平衡(单旋转和双旋转)。
这里认为第一个不平衡的节点为a
单旋转的使用情况:
1.对a的左儿子的左子树进行插入;
2.对a的右儿子的右子树进行插入;
注:
单旋转需将儿子节点上浮,a和其子树的root作为其儿子,原儿子节点的另一侧子树现挂置a下方。
双旋转的使用情况:
1.对a的右儿子的左子树进行插入;
2.对a的左儿子的右子树进行插入;
注:
双旋转将子树的root上浮,a和其儿子节点作为root的儿子,原子树根root的两侧子树分别挂在a和原来的儿子节点下。
代码实现
1、实现各种旋转
/***@name Single_Rotate_left:单旋转 不平衡节点的左儿子上浮
**/
AvlTree Single_Rotate_left(AvlTree K2)
{AvlTree temp=K2->left;K2->left=temp->right;temp->right=K2;return temp;
}/***@name Single_Rotate_right:单旋转 不平衡节点的右儿子上浮
**/
AvlTree Single_Rotate_right(AvlTree K2)
{AvlTree temp=K2->right;K2->right=temp->left;temp->left=K2;return temp;
}/***@name Double_Rotate_left:双旋转 左儿子的右子树
**/
AvlTree Double_Rotate_left(AvlTree K3)
{AvlTree temp=K3->left->right;K3->left->right=temp->left;temp->left=K3->left;K3->left=temp->right;temp->right=K3;return temp;
}/***@name Double_Rotate_left:双旋转 右儿子的左子树
**/
AvlTree Double_Rotate_right(AvlTree K3)
{AvlTree temp=K3->right->left;K3->right->left=temp->right;temp->right=K3->right;K3->right=temp->left;temp->left=K3;return temp;
}
2.实现插入
这里注意插入后,节点需要进行平衡性判断,若不平衡,再进行判断,是实现左(单/双)旋转or右(单/双)旋转。
/***@name Insert:插入一个新的树节点 *@param1 data:新的树节点的数据*@param2 T:从该树节点向下插*@ret :返回插入完成并平衡过了的该树节点
**/
AvlTree Balance_BinaryTree::Insert(int data,AvlTree T)
{if(T==NULL) //如果递归到空节点的话 新建一个树节点后返回{AvlTree temp=new AvlNode;temp->data=data;temp->left=temp->right=NULL;temp->height=1;T=temp;}else{if(data<T->data){T->left=Insert(data,T->left);if(Height(T->left)-Height(T->right)==2) //此时左子树的高度比右子树的高度大2 需要平衡{if(data<T->left->data) //此时说明插入的位置在左儿子的左子树 进行左单旋转T=Single_Rotate_left(T);else if(data>T->left->data) //此时说明插入的位置在左儿子的右子树 进行左双旋转T=Double_Rotate_left(T);}}else if(data>T->data){T->right=Insert(data,T->right);if(Height(T->right)-Height(T->left)==2) //此时右子树的高度比左子树的高度大2 需要平衡{if(data>T->right->data) //此时说明插入的位置在右儿子的右子树 进行右单旋转T=Single_Rotate_right(T);else if(data<T->right->data) //此时说明插入的位置在右儿子的左子树 进行右双旋转T=Double_Rotate_right(T);}}else //如果插入的元素相同则报错{cout<<"already have the same element"<<endl; }T->height=Max(Height(T->left),Height(T->right))+1; //插入完成后重新计算该树节点的高度}return T;
}
数据结构与算法分析(七)——C++实现平衡二叉树相关推荐
- 20172324 2018-2019-1 《程序设计与数据结构》第七周学习总结
20172324 2018-2019-1 <程序设计与数据结构>第七周学习总结 教材学习内容总结 概述 二叉查找树是一种含有附加属性的二叉树,即其左孩子小于父节点,而父节点又小于等于其右孩 ...
- 数据结构与算法分析(十六)--- 如何设计更高效的字符串匹配算法?(BF + RK + KMP + BMH)
文章目录 一.Brute Force 匹配算法 二.Rabin–Karp 匹配算法 三.Knuth–Morris–Pratt 匹配算法 四.Boyer-Moore-Horspool 匹配算法 五.字符 ...
- 2018-2019-20172321 《Java软件结构与数据结构》第七周学习总结
2018-2019-20172321 <Java软件结构与数据结构>第七周学习总结 教材学习内容总结 第11章 二叉查找树 一.概述 二叉查找树是一种含有附加属性的二叉树,该属性即其左孩子 ...
- 数据结构与算法分析 作业讲解文档目录
参考教材:<数据结构(C语言版 第2版)> 严蔚敏,李冬梅,吴伟民编著,人民邮电出版社,2022年版. 对应的作业题讲解视频: 数据结构与算法分析作业讲解视频合集https://ww ...
- Weiss的数据结构与算法分析(C++版)源码编译说明
最近尝试编译Weiss的那本数据结构与算法分析(C++版)提供的源代码时,遇到一些问题,特记录如下: 考虑到该书提供的代码是使用模板技术较多,这在提供简洁代码的同时,也给源码的编译带来了一些问题.因而 ...
- 数据结构与算法分析(C++版)(第二版)
查看书籍详细信息: 数据结构与算法分析(C++版)(第二版) 内容简介 本书采用程序员最爱用的面向对象C++语言来描述数据结构和算法,并把数据结构原理和算法分析技术有机地结合在一起,系统介绍了各种类型 ...
- 数据结构与算法分析c++第四版_研分享 | 人工智能学院数据结构与算法分析考研备考整理...
数据结构与算法分析 1.在顺序表中插入或删除一个元素,需要平均移动(表中一半)元素,具体移动的元素个数与(表长和该元素在表中的位置)有关. 2.如果有两个数,每个数的所有约数(除它本身以外)的和正好等 ...
- 20172301 《程序设计与数据结构》第七周学习总结
20172301 <程序设计与数据结构>第七周学习总结 教材学习内容总结 二叉查找树是一种含有附加属性的二叉树,其左孩子小于父结点,父结点小于或者等于右孩子. 用链表实现二叉查找树 add ...
- 数据结构与算法分析-第2章
<?xml version="1.0" encoding="utf-8"?> 数据结构与算法分析-第2章 数据结构与算法分析-第2章 Table o ...
- (c#)数据结构与算法分析 --递归
递归 不知道有新手听没听过别人拿剥糖块来形容递归,诸如一层层地剥好比一层层地进入递归.这种比喻可是误导了我,只想着剥了,其实剥完皮儿,取出糖块,再把皮儿一层层地穿上才算个完整的递归. 递归就是 ...
最新文章
- 盘点那些具有“爆款”潜力的智能家居产品
- RxSwift ViewModel定义
- 每个程序员都必须知道的8种数据结构
- python打印自动换行如何解决_解决python DataFrame 打印结果不换行问题
- 深入浅出WPF(2)——解剖最简单的GUI程序
- vray学习笔记(3)-多维子材质是个什么东西
- [转载] 列表、元组及通用序列操作
- 基于JAVA+SpringMVC+Mybatis+MYSQL的周报管理系统
- Java编程:排序算法——插入排序
- Atitit ever note org log t99 目录 1. data	1 2. Sik dsk zip mode	1 3. Local exted stat	2 4. Recy	3 1
- php查询mysql增加模板消息_php 实现发送微信模板消息
- POJ2653 Pick-up sticks
- linux usb重定向window,基于Linux的USB设备重定向研究.pdf
- matlab中simulink文件批量修改版本
- DDoS Perl IrcBot v1.0分析复现与处置
- 爆款综艺也总火不过三季?谁来背锅?
- pvq真值表_逻辑学真值表
- sd卡计算机无法读取数据,细说电脑无法读取sd卡
- Powershell添加英文输入法
- 鸡啄米编程入门教程代码实现
热门文章
- python绘制两个离散变量关系图——马赛克图
- Linux赋予目录或文件任何人都可以读、写、执行的操作
- senborn绘制混淆矩阵
- Python捕获 Warning 警告
- npm 可视化html编辑器,超给力 Vue.js 可视化H5拖拽编辑器Quark-H5
- python处理json文件_python处理json文件
- Windows备份服务器运行失败,用Windows Server Backup搞定服务器备份
- 面向java开发者的函数式编程_函数式编程让你忘记设计模式
- spring-boot-2.0.3应用篇 - shiro集成
- Nginx Learning (1)