代码如下:

#include <iostream>
using namespace std;template <typename T>
struct AVLNode
{typedef AVLNode<T>  Node;AVLNode(const T &val = T()):_parent(nullptr),_left(nullptr),_right(nullptr),_val(nullptr),_bf(0){}Node *_parent;Node *_left;Node *_right;T _val;int _bf;
};template<typename T>
class AVLTreeNode
{public:typedef AVLNode<T> Node;Node *LL_Rotate(Node *a){Node *b;b = a->_left;a->_left = b->_right;b->_right = a;a->_bf = b->_bf = 0;return b;}Node *RR_Rotate(Node *a){Node *b;b = a->_right;a->_right = b->_left;b->_left = a;a->_bf = b->_bf = 0;return b;}Node *LR_Rotate(Node *a){Node *b, *c;b = a->_left;c = b->_right;a->_left = c->_right;b->_right = c->_left;c->_left = b;c->_right = a;if (c->_bf == 1) {a->_bf = -1;b->_bf = 0;}else if (c->_bf == -1){a->_bf = 0;b->_bf = 1;}else{a->_bf = b->_bf = 0;}c->_bf = 0;return c;}Node *RL_Rotate(Node *a){Node *b, *c;b = a->_right;c = b->_left;a->_right = c->_left;b->_left = c->_right;c->_left = a;c->_right = b;if (c->_bf == 1){a->_bf = 0;b->_bf = -1;}else if (c->_bf == -1){a->_bf = 1;b->_bf = 0;}else{a->_bf = b->_bf = 0;}c->_bf = 0;return c;}void AVLInsert(Node *&pavlt, Node *s){Node *f, *a, *b, *p, *q;if (pavlt == nullptr)//没有根结点,那么插入的结点s就当作根结点{pavlt = s;return;}a = pavlt;//指针a记录离*s最近的平衡因子不为0的结点,f指向*a的父结点f = nullptr;p = pavlt;q = nullptr;while (p != nullptr){if (p->_val == s->_val) return;if (p->_bf != 0){a = p;f = q;}q = p;if (s->_val < p->_val) p = p->_left;else p = p->_right;}if (s->_val < q->_val) q->_left = s;else q->_right = s;p = a;while (p != s){if (s->_val < p->_val){p->_bf++;p = p->_left;}else{p->_bf--;p = p->_right;}}if (a->_bf > -2 && a->_bf < 2) return; //插入结点后,没有破坏树的平衡性if (a->_bf == 2){b = a->_left;if (b->_bf == 1) p = LL_Rotate(a);else p = LR_Rotate(a);}else{b = a->_right;if (b->_bf == 1) p = RL_Rotate(a);else p = RR_Rotate(a);}if (f == nullptr) pavlt = p;//原*a是AVL树的根else if (f->_left == a) f->_left = p;else f->_right = p;}void CreateTree(){int n;cin >> n;for (int i = 0; i < n; i++){Node *s = new Node;cin > s->_val;AVLInsert(_root, s);}}void InOrderTree(){InOrder(_root);cout << endl;}private:Node *_root;void InOrder(Node *cur){if (cur){InOrder(cur->_left);cout << cur->_val << " ";InOrder(cur->_right);}}
};

C++泛型编程实现平衡二叉搜索树AVL相关推荐

  1. 五.树,二叉树,二叉搜索树(BST)和自平衡二叉搜索树(AVL)

    1.树 树是一种数据结构 比如:目录结构 树是一种可以递归定义的数据结构 树是由n个节点组成的集合: 如果 n=0, 那这是一颗空树 如果 n>0, 那存在1个节点作为树的根节点,其他节点可以分 ...

  2. 看动画学算法之:平衡二叉搜索树AVL Tree

    简介 平衡二叉搜索树是一种特殊的二叉搜索树.为什么会有平衡二叉搜索树呢? 考虑一下二叉搜索树的特殊情况,如果一个二叉搜索树所有的节点都是右节点,那么这个二叉搜索树将会退化成为链表.从而导致搜索的时间复 ...

  3. 《恋上数据结构第1季》平衡二叉搜索树、AVL树

    AVL树 二叉搜索树缺点分析 改进二叉搜索树 平衡(Balance) 理想平衡 如何改进二叉搜索树? 平衡二叉搜索树(Balanced Binary Search Tree) AVL树 BST 对比 ...

  4. 数据结构与算法-平衡二叉搜索树

    平衡二叉搜索树 1.自平衡的二叉搜索树 2.平衡 (1)空树平衡 (2)非空树平衡 左右子树平衡 左右子树高度差绝对值 <= 1 3.平衡因子 左右子树的高度差的衡量值 -1 0 1 (一)平衡 ...

  5. VC++2012编程演练数据结构《9》平衡二叉搜索树

    平衡二叉搜索树 任何结点的左子树和右子树高度最多相差1的二叉搜索树. (1)AVL树的插入算法 a. 插入结点之后仍然是AVL树,则不调整: b. 插入结点之后不再满足AVL树条件,则进行调整,根据导 ...

  6. 【二叉树进阶】红黑树(Red Black Tree) - 平衡二叉搜索树

    文章目录 一.红黑树的概念 二.红黑树的性质 2.1 红黑树和AVL树效率对比 三.红黑树的结构(KV模型) 四.红黑树的插入 4.1 插入节点 4.2 平衡化操作(难点) 4.2.1 情况一 4.2 ...

  7. 二叉搜索树、平衡二叉搜索树和红黑树

    文章目录 一. 二叉搜索树(Binary Sort Tree) 二. 二叉平衡搜索树(AVL) 三. 红黑树 一. 二叉搜索树(Binary Sort Tree) 二叉搜索树,又称为二叉排序树(二叉查 ...

  8. 最适合新手看的平衡二叉搜索树(BBST)的创建,包含详细过程,一看就会(C++版)

    写在前面:本人大二小白,本篇文章是我第一次写博客,用来记录我的学习过程,我想将我在学习中遇到的各种的问题和困难写下来,希望大家能够不要犯同样的错误.我会尽可能的详细的把每一个步骤都解释清楚,那么废话不 ...

  9. 高度平衡二叉搜索树(AVLTree)

    高度平衡二叉搜索树(AVLTree) 目录 AVL树的概念 AVL树节点的定义 AVL树的插入 AVL树的旋转 右单旋 左单旋 左右双旋 右左双旋 AVL树的验证 代码实现 AVL树的概念 二叉搜索树 ...

最新文章

  1. 漏洞payload 靶机_【CS学习笔记】5、如何建立Payload处理器
  2. SpringBoot - 构建监控体系02_定义度量指标和 Actuator 端点
  3. MySQL buffer pool中的三种链
  4. genius choice for gopro
  5. GCC编译过程以及对应FILE文件表
  6. java成绩查询_JavaWeb项目第三次总结_成绩查询的实现
  7. WordPress主题-Real Estate 7–房地产[更至v3.1.0]
  8. 每天一道剑指offer-顺时针打印矩阵
  9. 基本数据类型与字符串之间的转换
  10. vb6计算机,[计算机软件及应用]VB6.ppt
  11. 关系代数 元组关系演算
  12. 基于深度学习的Image Inpainting (图像修复)论文整理与概述
  13. 安卓手机(荣耀/vivo)下载以及安装Charles证书
  14. D. Lizard Era: Beginning
  15. Linux I/O编程 实验内容
  16. 多机器人系统仿真平台(摘要与目录)
  17. C语言PAT刷题 - 1019 数字黑洞
  18. 苹果计算机快捷键设置,那些你必须熟悉苹果电脑的快捷键,你知道吗?
  19. 杨百万:中国股市是政策市 炒股要听党和政府的话
  20. 复旦大学信息科学与工程考研经验

热门文章

  1. Android之玩转选项卡(TabHost、TabWidget、FrameLayout)
  2. sigmoid函数_常用的激活(激励)函数——深度学习笔记(建议收藏)
  3. 中国第一个发《Nature》的竟然是清朝人!被皇帝夸天下第一,他却觉得羞耻..........
  4. 85元一个万能工具箱,配齐24种螺丝刀+扳手,媲美德国工艺,家庭必备
  5. 现在要吃软饭的,都这么明目张胆了吗?
  6. 谁还没个黑历史了。。。 | 今日最佳
  7. 到底要不要拯救地球?真·逻辑鬼才!| 今日最佳
  8. 获取上传图片的大小 php,thinkphp5 获取上传图片的大小和信息
  9. python进阶之学习笔记_干货 | Python进阶系列之学习笔记(四)
  10. 西北纺织工学院97级计算机系学生毕业名单,原西北纺织工学院更名为西安工程大学...