其中仅完成插入结点之后树的调整平衡
方法:左旋 右旋 左右旋转 右左旋转
#include<iostream>
#include<queue>
using namespace std;
typedef int Data;
struct Node
{
Data data;
Node* left, *right;
};
class AVLTree//平衡二叉搜索树
{
public:
AVLTree()
{
root = NULL;
}
void creat(int a[],int n);
void PreOrder() { PreOrder(root);}
void ceng();
int GetHeight(Node* r);
private:
void PreOrder(Node* r);
void insert(int x,Node *&r);
void SingleLeftRotation(Node *&A); //左旋
void SingleRightRotation(Node*& A);//右旋
void DoubleLeftRightRotation(Node*& A);//左右旋转
void DoubleRightLeftRotation(Node*& A);//右左旋转
Node* root;
};
void AVLTree::creat(int a[],int n)
{
for (int i = 0; i < n; i++)
{
insert(a[i], root);
}
}
void AVLTree::ceng()
{
if (!root) return;
queue<Node*> q;
q.push(root);
int k = 5;
while (!q.empty()) {
cout << q.front()->data<<" ";
if (q.front()->left) q.push(q.front()->left);
if (q.front()->right) q.push(q.front()->right);
q.pop();
}
}
int AVLTree::GetHeight(Node* r)
{
return r == NULL ? 0 : 1 + max(GetHeight(r->left), GetHeight(r->right));
}
void AVLTree::PreOrder(Node* r)
{
if (!r) return;
cout << r->data << " ";
PreOrder(r->left);
PreOrder(r->right);
}
void AVLTree::insert(int x,Node *&r)
{
if (!r) {
r = new Node;
r->data = x;
r->left = r->right = NULL;
}
else if (x < r->data) {
insert(x, r->left);
if (fabs(GetHeight(r->left) - GetHeight(r->right) )== 2)
if (x < r->left->data) SingleLeftRotation(r);
else DoubleLeftRightRotation(r);
}
else if (x > r->data) {
insert(x, r->right);
if (fabs(GetHeight(r->left) - GetHeight(r->right))== 2)
if (x < r->right->data) DoubleRightLeftRotation(r);
else SingleRightRotation(r);
}
}
void AVLTree::SingleLeftRotation(Node*& A)
{
Node* B = A->left;
A->left = B->right;
B->right = A;
A = B;
}
void AVLTree::SingleRightRotation(Node*& A)
{
Node* B = A->right;
A->right = B->left;
B->left = A;
A = B;
}
void AVLTree::DoubleLeftRightRotation(Node*& A)
{
SingleRightRotation(A->left);
SingleLeftRotation(A);
}
void AVLTree::DoubleRightLeftRotation(Node*& A)
{
SingleLeftRotation(A->right);
SingleRightRotation(A);
}
int main()
{
int a[12];
int n;
cin >> n;
for (int i = 0; i < n; i++)cin >> a[i];
AVLTree t;
t.creat(a, n);
t.ceng();
return 0;
}