C++泛型编程实现平衡二叉搜索树AVL
Posted Wecccccccc
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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的主要内容,如果未能解决你的问题,请参考以下文章