标头
#pragma once
struct AvlNode;
int height(AvlNode * t);
int max(int x, int y);
void rotateWithRightChild(AvlNode * & k2);
void rotateWithLeftChild(AvlNode * & k2);
void insert(int x, AvlNode * & t);
void ShowTree(AvlNode * t);
源.cpp
#include "stdafx.h"
#include "iostream"
#include "标头.h"
using namespace std;
struct AvlNode
{
int data;
AvlNode * lchild;
AvlNode * rchild;
int height;
AvlNode(int elem, AvlNode * l, AvlNode * r, int h = 0) :data(elem), lchild(l), rchild(r), height(h)
{
}
};
int height(AvlNode * t)
{
return t == NULL ? -1 : t->height;
}
int max(int x, int y)
{
return x > y ? x : y;
}
//左旋
void rotateWithRightChild(AvlNode * & k2)
{
AvlNode * k1 = k2->rchild;
k2->rchild = k1->lchild;
k1->lchild = k2;
k1->height = max(height(k1->rchild), k2->height) + 1;
k2->height = max(height(k2->lchild), height(k2->rchild)) + 1;
k2 = k1;
}
//右旋
void rotateWithLeftChild(AvlNode * & k2)
{
AvlNode * k1 = k2->lchild;
k2->lchild = k1->rchild;
k1->rchild = k2;
k1->height = max(height(k1->lchild), k2->height) + 1;
k2->height = max(height(k2->lchild), height(k2->rchild)) + 1;
k2 = k1;
}
void insert(int x, AvlNode * & t)
{
if (t == NULL)
{
t = new AvlNode(x, NULL, NULL);
}
else if (x > t->data)
{
insert(x, t->lchild);
if (height(t->lchild) - height(t->rchild) == 2)
{
if (x > t->lchild->data)
{
rotateWithLeftChild(t);
}
else
{
rotateWithRightChild(t->lchild);
rotateWithLeftChild(t);
}
}
}
else if (x < t->data)
{
insert(x, t->rchild);
if (height(t->rchild) - height(t->lchild) == 2)
{
if (x < t->lchild->data)
{
rotateWithRightChild(t);
}
else
{
rotateWithLeftChild(t->rchild);
rotateWithRightChild(t);
}
}
}
t->height = max(height(t->lchild), height(t->rchild)) + 1;
}
void ShowTree(AvlNode * t)
{
if (t != NULL)
{
cout << "data: " << t->data << "height: " << t->height << endl;
ShowTree(t->lchild);
ShowTree(t->rchild);
}
}