下面这个代码创建的时候总是出问题,好像只有左旋,右旋的时候没问题,但是左右型和右左型就会出错.求大佬帮帮忙!
#include<bits/stdc++.h>
using namespace std;
class AvlTreeNode {
public:
int heights;
int data;
AvlTreeNode* left, * right;
public:
AvlTreeNode(int x) :data(x), left(NULL), right(NULL), heights(1) {}
};
int height(AvlTreeNode* root)
{
if (!root)
return 0;
else
return root->heights;
}
AvlTreeNode* LL(AvlTreeNode* root)//左左型,右旋
{
AvlTreeNode* tmpr=root;
AvlTreeNode* tmp = root->left;
tmpr->left = tmp->right;
tmp->right = tmpr;
tmpr->heights = max(height(tmpr->left), height(tmpr->right)) + 1;
tmp->heights = max(height(tmp->left), height(tmp->right)) + 1;
return tmp;
}
AvlTreeNode* RR(AvlTreeNode* root)//右右型,左旋
{
AvlTreeNode* tmpr=root;
AvlTreeNode* tmp = root->right;
tmpr->right = tmp->left;
tmp->left = tmpr;
tmpr->heights = max(height(tmpr->left), height(tmpr->right)) + 1;
tmp->heights = max(height(tmp->left), height(tmp->right)) + 1;
return tmp;
}
AvlTreeNode* LR(AvlTreeNode* root)//左右型,左右旋
{
if(root)
{
root->left=RR(root->left);
return LL(root);
}
}
AvlTreeNode* RL(AvlTreeNode* root)//右左型,右左旋
{
if(root)
{
root->right = LL(root->right);
return RR(root);
}
}
AvlTreeNode* insert(AvlTreeNode* root,int key)
{
if (!root)
{
return new AvlTreeNode(key);
}
if (key < root->data)
{
root->left = insert(root->left, key);
if (height(root->left) - height(root->right) >1)
{
if (key > root->left->data)
{
root = LR(root);
}
else if(key < root->left->data)
root = LL(root);
}
}
else if(key>root->data)
{
root->right = insert(root->right, key);
if (height(root->right) - height(root->left) >1)
{
if (key > root->data)
{
root = RR(root);
}
else if(key < root->data)
root = RL(root);
}
}
root->heights = max(height(root->left),height(root->right)) + 1;
return root;
}
void Inorder(AvlTreeNode* root)
{
if (root)
{
Inorder(root->left);
cout << root->data << " ";
Inorder(root->right);
}
}
void Preorder(AvlTreeNode* root)
{
if (root)
{
cout << root->data << " ";
Preorder(root->left);
Preorder(root->right);
}
}
void CreateTree(AvlTreeNode*& T,int* nums,int n)
{
for (int i=0;i<n;i++)
{
T = insert(T, nums[i]);
}
}
int main()
{
AvlTreeNode* T=NULL;
printf("请输入您要输入的元素的个数:");
int n;
scanf("%d", &n);
int a[10];
for (int i = 0; i < n; i++)//建立
{
printf("请输入第%d个元素", i + 1);
scanf("%d", &a[i]);
}
CreateTree(T, a, n);
cout<<"中序输出:";
Inorder(T);
cout<<"前序输出:";
Preorder(T);
int p, q;
cout<<"请输入您要查找的两个节点:";
cin >> p >> q;
AvlTreeNode* ancestor = lowestCommonAncestor(T, p, q);
cout << p << "和" << q << "的最近祖先是:" << ancestor->data << endl;
}