c++实现AVL树的左旋
在这里插入代码片#include"pch.h"
#include<iostream>
#include<math.h>
#include<string>
#include<algorithm>
using namespace std;
class Node
{
public:
Node* leftnode;
Node* rightnode;
int value;
int height;
Node()
{
leftnode = NULL;
rightnode = NULL;
value = 0;
}
void add(int v)//插入数据
{
if (value == 0)
{
value = v;
}
else
{
if (value >= v)
{
if (leftnode == NULL)
{
leftnode = new Node();
}
leftnode->add(v);
}
else
{
if (rightnode == NULL)
{
rightnode = new Node();
}
rightnode->add(v);
}
}
}
Node* reverse(Node* n)
{
cout<<"左边高度" << maxmun(n->leftnode) << endl;
cout << "右边高度" << maxmun(n->rightnode) << endl;
if (maxmun(n->leftnode) - maxmun(n->rightnode) >= 2)
{
n=ll(n);
cout << "执行左旋"<<endl;
}
return n;
}
Node* ll(Node* n)
{
Node* left = n->leftnode;
n->leftnode = left->rightnode;
left->rightnode = n;
return left;
}
void values()//中序遍历
{
if (leftnode != NULL)
{
leftnode->values();
}
cout << value<<endl;
if (rightnode != NULL)
{
rightnode->values();
}
}
int maxmun(Node*n)//计算左右子树高度
{
int sum1 = 1;
int sum2 = 1;
Node *m = n;
if (n == NULL)
{
height = 0;
return height;
}
else
{
height = 1;
while (n->leftnode != NULL)
{
sum1++;
n = n->leftnode;
}
while (m->rightnode != NULL)
{
sum2++;
m = m->rightnode;
}
height = max(sum1, sum2);
return height;
}
}
};
int main()
{
int m[] = {5,4,3,2,1};
Node* n = new Node();
for (int i = 0; i < 5; i++)
{
n->add(m[i]);
n=n->reverse(n);
}
n->values();
free(n);
}