#include <iostream>
#include <algorithm>
#include <queue>
using namespace std;
/*
*AVL树
*/
typedef struct btree{
int data;
int height;
struct btree* lchild;
struct btree* rchild;
btree() {
data = height = 0;
lchild = rchild = NULL;
}
btree(int num) {
data = num;
height = 0;
lchild = rchild = NULL;
}
}node;
void fixAVL(node* &root);
node* getMin(node* root);
int getHeight(node* root);
node* insertIntoAvl(node* &root, int num);
void deleteInAVLTree(node* &root, int num);
//获取以该节点为根节点树的高度
int getHeight(node* root) {
return root == NULL ? -1 : root->height;
}
//AVL的插入操作
node* insertIntoAvl(node* &root, int num) {
if (root == NULL) {
root = new node(num);
}
else {
if (root->data > num) {
root->lchild = insertIntoAvl(root->lchild, num);
}
if (root->data < num) {
root->rchild = insertIntoAvl(root->rchild, num);
}
//此时不平衡了
if (fabs(getHeight(root->lchild) - getHeight(root->rchild)) == 2) {
fixAVL(root);
}
}
root->height = max(getHeight(root->lchild), getHeight(root->rchild)) + 1;
return root;
}
//AVL删除
void deleteInAVLTree(node* &root, int num) {
if (root) {
if (root->data == num) {
//叶子节点
if (root->lchild == NULL && root->rchild == NULL) {
delete root;
root = NULL;
}
//左子树为空 右子树不为空
else if (root->lchild == NULL && root->rchild != NULL) {
node* t = root;
root = root->rchild;
delete t;
t = NULL;
}
//左子树不为空 右子树为空
else if (root->lchild != NULL && & root->rchild == NULL) {
node* t = root;
root = root->lchild;
delete t;
t = NULL;
}
//左右子树都不为空 则选择右子树最小值来填补被删除的结点
else {
node* rightMinNode = getMin(root->rchild);
deleteInAVLTree(root, rightMinNode->data);
root->data = rightMinNode->data;
}
}
else if(root->data > num){
deleteInAVLTree(root->lchild, num);
}
else {
deleteInAVLTree(root->rchild, num);
}
if (root && fabs(getHeight(root->lchild) - getHeight(root->rchild)) == 2) {
fixAVL(root);
root->height = max(getHeight(root->lchild), getHeight(root->rchild)) + 1;
}
}
}
//返回全树的最小值所在结点
node* getMin(node* root) {
if (root) {
node* p = root;
while (p->lchild) {
p = p->lchild;
}
return p;
}
throw new exception("tree is empty!");
return NULL;
}
//LL
void AVLTreeBalanceOfLL(node* &root) {
if (root) {
node* p = root->lchild;
root->lchild = p->rchild;
p->rchild = root;
root->height = max(getHeight(root->lchild), getHeight(root->rchild)) + 1;
p->height = max(getHeight(p->lchild), getHeight(p->rchild)) + 1;
root = p;
}
}
//LR
void AVLTreeBalanceOfLR(node* &root) {
if (root) {
node* p = root->lchild->rchild;
node* q = root->lchild;
root->lchild = p->rchild;
q->rchild = p->lchild;
p->lchild = q;
p->rchild = root;
root->height = max(getHeight(root->lchild), getHeight(root->rchild)) + 1;
q->height = max(getHeight(q->lchild), getHeight(q->rchild)) + 1;
p->height = max(getHeight(p->lchild), getHeight(p->rchild)) + 1;
root = p;
}
}
//RR
void AVLTreeBalanceOfRR(node* &root) {
if (root) {
node* p = root->rchild;
root->rchild = p->lchild;
p->lchild = root;
root->height = max(getHeight(root->lchild), getHeight(root->rchild)) + 1;
p->height = max(getHeight(p->lchild), getHeight(p->rchild)) + 1;
root = p;
}
}
//RL
void AVLTreeBalanceOfRL(node* &root) {
if (root) {
node* p = root->rchild->lchild;
node* q = root->rchild;
root->rchild = p->lchild;
q->lchild = p->rchild;
p->lchild = root;
p->rchild = q;
root->height = max(getHeight(root->lchild), getHeight(root->rchild)) + 1;
q->height = max(getHeight(q->lchild), getHeight(q->rchild)) + 1;
p->height = max(getHeight(p->lchild), getHeight(p->rchild)) + 1;
root = p;
}
}
//AVL的自平衡函数
void fixAVL(node* &root) {
if (root) {
//判断是LL 还是LR
if (getHeight(root->lchild) - getHeight(root->rchild) == 2) {
//LL
if (getHeight(root->lchild->lchild) > getHeight(root->lchild->rchild)) {
AVLTreeBalanceOfLL(root);
}
//LR
else {
AVLTreeBalanceOfLR(root);
}
}
//判断是RR还是RL
else {
//RR
if (getHeight(root->rchild->rchild) > getHeight(root->rchild->lchild)) {
AVLTreeBalanceOfRR(root);
}
//RL
else {
AVLTreeBalanceOfRL(root);
}
}
}
}
//中序遍历测试
void inorder(node* root) {
if (root) {
inorder(root->lchild);
cout << root->data << " ";
inorder(root->rchild);
}
}
int main()
{
node* root = NULL;
insertIntoAvl(root, 4);
insertIntoAvl(root, 5);
insertIntoAvl(root, 6);
insertIntoAvl(root, 7);
insertIntoAvl(root, 8);
deleteInAVLTree(root, 6);
inorder(root);
return 0;
}
AVLTree平衡二叉树---C++实现
最新推荐文章于 2020-04-22 18:29:52 发布