MyAVL.h
typedef struct AVLTreeNode
{
int key;
int height;
AVLTreeNode* lChild;
AVLTreeNode* rChild;
}AvlNode,*pavlNode;
int AvlTreeHeight(AvlNode *root);
int max(int a, int b);
pavlNode LL(pavlNode &root);
pavlNode RR(pavlNode &root);
pavlNode RL(pavlNode &root);
pavlNode LR(pavlNode &root);
pavlNode InsertNode(pavlNode &root, int key);
AvlNode * TreeNodePre(pavlNode root, int key);//找最右结点(指针)
AvlNode * TreeNodePost(pavlNode root, int key);//找最左结点(指针)
void PreOrder(const pavlNode &root);
void InOrder(const pavlNode &root);
void TreeDestroy(pavlNode &root);
MyAVL.cpp
#include"MyAVL.h"
#include<iostream>
using namespace std;
int AvlTreeHeight(AvlNode *root)
{
if (root == NULL)
return 0;
else
return (root->height);
}
int max(int a, int b){ return a > b ? a : b; }
pavlNode LL(pavlNode &root)
{
if (root == NULL)
return root;
AvlNode *P=root->lChild;
root->lChild = P->rChild;
P->rChild = root;
root->height = max(AvlTreeHeight(root->lChild), AvlTreeHeight(root->rChild)) + 1;
P->height = max(AvlTreeHeight(P->lChild), root->height) + 1;
return P;//新的根节点
}
pavlNode RR(pavlNode &root)
{
if (NULL == root)
return root;
AvlNode *P = root->rChild;
root->rChild = P->lChild;
P->lChild = root;
root->height = max(AvlTreeHeight(root->lChild), AvlTreeHeight(root->rChild)) + 1;
P->height = max(AvlTreeHeight(P->rChild), root->height) + 1;
return P;//新的根节点
}
pavlNode RL(pavlNode &root)
{
root->rChild = LL(root->rChild);
return RR(root);
}
pavlNode LR(pavlNode &root)
{
root->lChild = RR(root->lChild);
return LL(root);
}
pavlNode InsertNode(pavlNode &root, int key)
{
if (NULL == root)
{
root = new AvlNode();
if (NULL == root)
{
cout << "new开辟AvlNode空间失败" << endl;
return root;
}
root->height = 0;
root->key = key;
root->lChild = root->rChild = NULL;
}
else if (key < root->key)
{
root->lChild = InsertNode(root->lChild, key);
if (2 == abs(AvlTreeHeight(root->lChild) - AvlTreeHeight(root->rChild)))
{
if (key < root->lChild->key)
root = LL(root);
else
root = LR(root);
}
}
else if (key >= root->key)
{
root->rChild = InsertNode(root->rChild, key);
if (2 == abs(AvlTreeHeight(root->rChild) - AvlTreeHeight(root->lChild)))
{
if (key >root->rChild->key)
root = RR(root);
else
root = RL(root);
}
}
root->height = max(AvlTreeHeight(root->lChild), AvlTreeHeight(root->rChild)) + 1;
return root;
}
AvlNode * TreeNodePre(pavlNode root, int key) //最右结点
{
if (NULL == root)
return root;
while (NULL != root->rChild)
root = root->rChild;
return root;
}
AvlNode * TreeNodePost(pavlNode root, int key)
{
if (NULL == root)
return root;
while (NULL != root->lChild)
root = root->lChild;
return root;
}
void PreOrder(const pavlNode &root)
{
if (NULL == root)
return ;
cout << root->key << "(" << root->height << ")" << " ";
PreOrder(root->lChild);
PreOrder(root->rChild);
}
void InOrder(const pavlNode &root)
{
if (NULL == root)
return;
InOrder(root->lChild);
cout << root->key << "(" << root->height << ")" << " ";
InOrder(root->rChild);
}
void TreeDestroy(pavlNode &root)
{
if (NULL == root)
return;
if (NULL != root->lChild)
TreeDestroy(root->lChild);
if (NULL != root->rChild)
TreeDestroy(root->rChild);
delete root;
root = NULL;
}
main.cpp
#include"MyAVL.h"
#include<iostream>
#define len 10
using namespace std;
int main()
{
int a[len] = { 3, 2, 1, 4, 5, 6, 7, 10, 9, 8 };
cout << "待插入元素为:";
for (int idx = 0; idx != len; ++idx)
{
cout << a[idx] << " ";
}
cout << endl;
pavlNode root = NULL;
for (int i = 0; i < len; i++)
{
root = InsertNode(root, a[i]);
if (NULL == root)
cout << "插入" << a[i] << "失败" << endl;
}
cout << "中序遍历:";
InOrder(root);
cout << endl;
cout << "前序遍历:";
PreOrder(root);
cout << endl;
system("pause");
return 0;
}