平衡二叉树的概念

概念:
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++实现平衡二叉树相关推荐

  1. 20172324 2018-2019-1 《程序设计与数据结构》第七周学习总结

    20172324 2018-2019-1 <程序设计与数据结构>第七周学习总结 教材学习内容总结 概述 二叉查找树是一种含有附加属性的二叉树,即其左孩子小于父节点,而父节点又小于等于其右孩 ...

  2. 数据结构与算法分析(十六)--- 如何设计更高效的字符串匹配算法?(BF + RK + KMP + BMH)

    文章目录 一.Brute Force 匹配算法 二.Rabin–Karp 匹配算法 三.Knuth–Morris–Pratt 匹配算法 四.Boyer-Moore-Horspool 匹配算法 五.字符 ...

  3. 2018-2019-20172321 《Java软件结构与数据结构》第七周学习总结

    2018-2019-20172321 <Java软件结构与数据结构>第七周学习总结 教材学习内容总结 第11章 二叉查找树 一.概述 二叉查找树是一种含有附加属性的二叉树,该属性即其左孩子 ...

  4. 数据结构与算法分析 作业讲解文档目录

     参考教材:<数据结构(C语言版 第2版)> 严蔚敏,李冬梅,吴伟民编著,人民邮电出版社,2022年版.   对应的作业题讲解视频: 数据结构与算法分析作业讲解视频合集https://ww ...

  5. Weiss的数据结构与算法分析(C++版)源码编译说明

    最近尝试编译Weiss的那本数据结构与算法分析(C++版)提供的源代码时,遇到一些问题,特记录如下: 考虑到该书提供的代码是使用模板技术较多,这在提供简洁代码的同时,也给源码的编译带来了一些问题.因而 ...

  6. 数据结构与算法分析(C++版)(第二版)

    查看书籍详细信息: 数据结构与算法分析(C++版)(第二版) 内容简介 本书采用程序员最爱用的面向对象C++语言来描述数据结构和算法,并把数据结构原理和算法分析技术有机地结合在一起,系统介绍了各种类型 ...

  7. 数据结构与算法分析c++第四版_研分享 | 人工智能学院数据结构与算法分析考研备考整理...

    数据结构与算法分析 1.在顺序表中插入或删除一个元素,需要平均移动(表中一半)元素,具体移动的元素个数与(表长和该元素在表中的位置)有关. 2.如果有两个数,每个数的所有约数(除它本身以外)的和正好等 ...

  8. 20172301 《程序设计与数据结构》第七周学习总结

    20172301 <程序设计与数据结构>第七周学习总结 教材学习内容总结 二叉查找树是一种含有附加属性的二叉树,其左孩子小于父结点,父结点小于或者等于右孩子. 用链表实现二叉查找树 add ...

  9. 数据结构与算法分析-第2章

    <?xml version="1.0" encoding="utf-8"?> 数据结构与算法分析-第2章 数据结构与算法分析-第2章 Table o ...

  10. (c#)数据结构与算法分析 --递归

    递归     不知道有新手听没听过别人拿剥糖块来形容递归,诸如一层层地剥好比一层层地进入递归.这种比喻可是误导了我,只想着剥了,其实剥完皮儿,取出糖块,再把皮儿一层层地穿上才算个完整的递归. 递归就是 ...

最新文章

  1. 盘点那些具有“爆款”潜力的智能家居产品
  2. RxSwift ViewModel定义
  3. 每个程序员都必须知道的8种数据结构
  4. python打印自动换行如何解决_解决python DataFrame 打印结果不换行问题
  5. 深入浅出WPF(2)——解剖最简单的GUI程序
  6. vray学习笔记(3)-多维子材质是个什么东西
  7. [转载] 列表、元组及通用序列操作
  8. 基于JAVA+SpringMVC+Mybatis+MYSQL的周报管理系统
  9. Java编程:排序算法——插入排序
  10. Atitit ever note org log t99 目录 1. data 1 2. Sik dsk zip mode 1 3. Local exted stat 2 4. Recy 3 1
  11. php查询mysql增加模板消息_php 实现发送微信模板消息
  12. POJ2653 Pick-up sticks
  13. linux usb重定向window,基于Linux的USB设备重定向研究.pdf
  14. matlab中simulink文件批量修改版本
  15. DDoS Perl IrcBot v1.0分析复现与处置
  16. 爆款综艺也总火不过三季?谁来背锅?
  17. pvq真值表_逻辑学真值表
  18. sd卡计算机无法读取数据,细说电脑无法读取sd卡
  19. Powershell添加英文输入法
  20. 鸡啄米编程入门教程代码实现

热门文章

  1. python绘制两个离散变量关系图——马赛克图
  2. Linux赋予目录或文件任何人都可以读、写、执行的操作
  3. senborn绘制混淆矩阵
  4. Python捕获 Warning 警告
  5. npm 可视化html编辑器,超给力 Vue.js 可视化H5拖拽编辑器Quark-H5
  6. python处理json文件_python处理json文件
  7. Windows备份服务器运行失败,用Windows Server Backup搞定服务器备份
  8. 面向java开发者的函数式编程_函数式编程让你忘记设计模式
  9. spring-boot-2.0.3应用篇 - shiro集成
  10. Nginx Learning (1)