平衡二叉树
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
typedef struct BanlanceTree
{
int value;
int hight;
struct BanlanceTree *leftChild, *rightChild;
}BanlanceTree;
BanlanceTree *head;
void initTree()
{
head = (BanlanceTree *)malloc(sizeof(BanlanceTree));
head->value = 10000;
head->leftChild = NULL;
head->rightChild = NULL;
head->hight = 0;
}
BanlanceTree* Search(BanlanceTree *node, BanlanceTree *parent, int value)
{
if (!node)return parent;
if (node->value == value)return node;
else if (node->value < value)return Search(node->rightChild, node, value);
else if (node->value > value)return Search(node->leftChild, node, value);
}
int GetDepth(BanlanceTree *node)
{
if (node == NULL)return 0;
else return max(GetDepth(node->leftChild), GetDepth(node->rightChild)) + 1;
}
void GetBalance(BanlanceTree *node)
{
node->hight = max(GetDepth(node->leftChild), GetDepth(node->rightChild));
}
void UpdateHight(BanlanceTree *node)
{
if (!node)return;
UpdateHight(node->leftChild);
UpdateHight(node->rightChild);
GetBalance(node);
}
void RoateRight(BanlanceTree *&node)
{
BanlanceTree *temporary = NULL;
temporary = node->leftChild;
node->leftChild = temporary->rightChild;
temporary->rightChild = node;
node = temporary;
UpdateHight(node);
}
void RoateLeft(BanlanceTree *&node)
{
BanlanceTree *temporary = NULL;
temporary = node->rightChild;
node->rightChild = temporary->leftChild;
temporary->leftChild = node;
node = temporary;
UpdateHight(node);
}
bool AVLInsert(BanlanceTree *&node,int value, BanlanceTree *parent)
{
if (!node)
{
node = (BanlanceTree *)malloc(sizeof(BanlanceTree));
node->value = value;
node->leftChild = NULL;
node->rightChild = NULL;
if (value > parent->value)parent->rightChild = node;
else parent->leftChild = node;
return true;
}
if (value == node->value)return false;
bool res = true;
if(value>node->value)
{
res = AVLInsert(node->rightChild, value,node);
if (res && GetDepth(node->leftChild) - GetDepth(node->rightChild)<-1)
{
if (value > node->rightChild->value)RoateLeft(node);
else if(value < node->rightChild->value)
{
RoateRight(node->rightChild);
RoateLeft(node);
}
}
}
else if (value < node->value)
{
res = AVLInsert(node->leftChild, value,node);
if (res && GetDepth(node->leftChild) - GetDepth(node->rightChild)>1)
{
if (value < node->leftChild->value)RoateRight(node);
else if (value > node->leftChild->value)
{
RoateLeft(node->leftChild);
RoateRight(node);
}
}
}
if (res)UpdateHight(node);
return res;
}
void print(BanlanceTree *node)
{
if (!node)return;
print(node->leftChild);
if(node->value!= 10000)cout << node->value << endl;
print(node->rightChild);
}
void Delete_AVL(BanlanceTree *&node, BanlanceTree *p)
{
if (!node->rightChild)
{
BanlanceTree *k=node;
p->value = node->value;
node = node->leftChild;
free(k);
}
else
{
Delete_AVL(node->rightChild, p);
if (GetDepth(node->leftChild) - GetDepth(node->rightChild) > 1)
RoateLeft(node);
}
UpdateHight(node);
}
bool DeleteItem(BanlanceTree *&node,int value)
{
if (!node)return false;
bool res = true;
if (node->value == value)
{
if (!node->leftChild)
node = node->rightChild;
else if (!node->rightChild)
node = node->leftChild;
else
Delete_AVL(node->leftChild, node);
}
else if(node->value>value)
{
res = DeleteItem(node->leftChild, value);
if (res && GetDepth(node->leftChild)-GetDepth(node->rightChild)>1)
{
if (value < node->leftChild->value)
RoateLeft(node);
else
{
RoateLeft(node->leftChild);
RoateRight(node);
}
}
else if (res && GetDepth(node->leftChild) - GetDepth(node->rightChild) < -1)
{
if (value > node->rightChild->value)
RoateRight(node);
else
{
RoateRight(node->rightChild);
RoateLeft(node);
}
}
}
else if(node->value<value)
{
res = DeleteItem(node->rightChild, value);
if (res && GetDepth(node->leftChild) - GetDepth(node->rightChild) > 1)
{
if (value < node->leftChild->value)
RoateLeft(node);
else
{
RoateLeft(node->leftChild);
RoateRight(node);
}
}
else if (res && GetDepth(node->leftChild) - GetDepth(node->rightChild) < -1)
{
if (value > node->rightChild->value)
RoateRight(node);
else
{
RoateRight(node->rightChild);
RoateLeft(node);
}
}
}
if (res)UpdateHight(node);
return res;
}
int main()
{
initTree();
int n = 7;
int a[100] = { 10,5,2,6,11,12,1};
for (int i = 0; i < n; i++)
AVLInsert(head, a[i],head);
DeleteItem(head,11);
print(head);
return 0;
}