C++泛型编程实现平衡二叉搜索树AVL
代码如下:
#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相关推荐
- 五.树,二叉树,二叉搜索树(BST)和自平衡二叉搜索树(AVL)
1.树 树是一种数据结构 比如:目录结构 树是一种可以递归定义的数据结构 树是由n个节点组成的集合: 如果 n=0, 那这是一颗空树 如果 n>0, 那存在1个节点作为树的根节点,其他节点可以分 ...
- 看动画学算法之:平衡二叉搜索树AVL Tree
简介 平衡二叉搜索树是一种特殊的二叉搜索树.为什么会有平衡二叉搜索树呢? 考虑一下二叉搜索树的特殊情况,如果一个二叉搜索树所有的节点都是右节点,那么这个二叉搜索树将会退化成为链表.从而导致搜索的时间复 ...
- 《恋上数据结构第1季》平衡二叉搜索树、AVL树
AVL树 二叉搜索树缺点分析 改进二叉搜索树 平衡(Balance) 理想平衡 如何改进二叉搜索树? 平衡二叉搜索树(Balanced Binary Search Tree) AVL树 BST 对比 ...
- 数据结构与算法-平衡二叉搜索树
平衡二叉搜索树 1.自平衡的二叉搜索树 2.平衡 (1)空树平衡 (2)非空树平衡 左右子树平衡 左右子树高度差绝对值 <= 1 3.平衡因子 左右子树的高度差的衡量值 -1 0 1 (一)平衡 ...
- VC++2012编程演练数据结构《9》平衡二叉搜索树
平衡二叉搜索树 任何结点的左子树和右子树高度最多相差1的二叉搜索树. (1)AVL树的插入算法 a. 插入结点之后仍然是AVL树,则不调整: b. 插入结点之后不再满足AVL树条件,则进行调整,根据导 ...
- 【二叉树进阶】红黑树(Red Black Tree) - 平衡二叉搜索树
文章目录 一.红黑树的概念 二.红黑树的性质 2.1 红黑树和AVL树效率对比 三.红黑树的结构(KV模型) 四.红黑树的插入 4.1 插入节点 4.2 平衡化操作(难点) 4.2.1 情况一 4.2 ...
- 二叉搜索树、平衡二叉搜索树和红黑树
文章目录 一. 二叉搜索树(Binary Sort Tree) 二. 二叉平衡搜索树(AVL) 三. 红黑树 一. 二叉搜索树(Binary Sort Tree) 二叉搜索树,又称为二叉排序树(二叉查 ...
- 最适合新手看的平衡二叉搜索树(BBST)的创建,包含详细过程,一看就会(C++版)
写在前面:本人大二小白,本篇文章是我第一次写博客,用来记录我的学习过程,我想将我在学习中遇到的各种的问题和困难写下来,希望大家能够不要犯同样的错误.我会尽可能的详细的把每一个步骤都解释清楚,那么废话不 ...
- 高度平衡二叉搜索树(AVLTree)
高度平衡二叉搜索树(AVLTree) 目录 AVL树的概念 AVL树节点的定义 AVL树的插入 AVL树的旋转 右单旋 左单旋 左右双旋 右左双旋 AVL树的验证 代码实现 AVL树的概念 二叉搜索树 ...
最新文章
- 漏洞payload 靶机_【CS学习笔记】5、如何建立Payload处理器
- SpringBoot - 构建监控体系02_定义度量指标和 Actuator 端点
- MySQL buffer pool中的三种链
- genius choice for gopro
- GCC编译过程以及对应FILE文件表
- java成绩查询_JavaWeb项目第三次总结_成绩查询的实现
- WordPress主题-Real Estate 7–房地产[更至v3.1.0]
- 每天一道剑指offer-顺时针打印矩阵
- 基本数据类型与字符串之间的转换
- vb6计算机,[计算机软件及应用]VB6.ppt
- 关系代数 元组关系演算
- 基于深度学习的Image Inpainting (图像修复)论文整理与概述
- 安卓手机(荣耀/vivo)下载以及安装Charles证书
- D. Lizard Era: Beginning
- Linux I/O编程 实验内容
- 多机器人系统仿真平台(摘要与目录)
- C语言PAT刷题 - 1019 数字黑洞
- 苹果计算机快捷键设置,那些你必须熟悉苹果电脑的快捷键,你知道吗?
- 杨百万:中国股市是政策市 炒股要听党和政府的话
- 复旦大学信息科学与工程考研经验
热门文章
- Android之玩转选项卡(TabHost、TabWidget、FrameLayout)
- sigmoid函数_常用的激活(激励)函数——深度学习笔记(建议收藏)
- 中国第一个发《Nature》的竟然是清朝人!被皇帝夸天下第一,他却觉得羞耻..........
- 85元一个万能工具箱,配齐24种螺丝刀+扳手,媲美德国工艺,家庭必备
- 现在要吃软饭的,都这么明目张胆了吗?
- 谁还没个黑历史了。。。 | 今日最佳
- 到底要不要拯救地球?真·逻辑鬼才!| 今日最佳
- 获取上传图片的大小 php,thinkphp5 获取上传图片的大小和信息
- python进阶之学习笔记_干货 | Python进阶系列之学习笔记(四)
- 西北纺织工学院97级计算机系学生毕业名单,原西北纺织工学院更名为西安工程大学...