平衡二叉搜索树创建不出

下面这个代码创建的时候总是出问题,好像只有左旋,右旋的时候没问题,但是左右型和右左型就会出错.求大佬帮帮忙!

#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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值