04-树5 Root of AVL Tree (25 分)

本文介绍AVL树的基本概念及其自平衡特性,并通过示例详细解释了在AVL树中进行节点插入及必要的平衡调整操作。文章提供了一段完整的C++代码实现,展示了如何在AVL树中插入新节点并确保树始终保持平衡状态。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

04-树5 Root of AVL Tree (25 分)

An AVL tree is a self-balancing binary search tree. In an AVL tree, the heights of the two child subtrees of any node differ by at most one; if at any time they differ by more than one, rebalancing is done to restore this property. Figures 1-4 illustrate the rotation rules.

F1.jpg

F2.jpg

F3.jpg

F4.jpg

Now given a sequence of insertions, you are supposed to tell the root of the resulting AVL tree.

Input Specification:

Each input file contains one test case. For each case, the first line contains a positive integer N (≤20) which is the total number of keys to be inserted. Then N distinct integer keys are given in the next line. All the numbers in a line are separated by a space.

Output Specification:

For each test case, print the root of the resulting AVL tree in one line.

Sample Input 1:

5
88 70 61 96 120

Sample Output 1:

70

Sample Input 2:

7
88 70 61 96 120 90 65

Sample Output 2:

88

 一道经典的自平衡二叉排序树的题,QAQ

#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
typedef struct AVLNode {
	int val;
	struct AVLNode *left;
	struct AVLNode *right;
	int height;
	//以此结点为根结点的树的高度
	AVLNode(){}
	AVLNode(int val):val(val), height(0), left(nullptr), right(nullptr){}
}AVLNode;
typedef AVLNode *AVLTree;
int GetHeight(AVLNode *p) {
	if (!p)
		return 0;
	p->height = max(GetHeight(p->left), GetHeight(p->right)) + 1;
	return p->height;
}

AVLTree RRrotation(AVLNode *root) {
	AVLNode *temp = root->right;
	root->right = temp->left;
	temp->left = root;
	return temp;
}

AVLTree LLrotation(AVLNode *root) {
	AVLNode *temp = root->left;
	root->left = temp->right;
	temp->right = root;
	return temp;
}

AVLTree RLrotation(AVLNode *root) {
	AVLNode *temp = root->right;
	root->right = LLrotation(temp);
	return RRrotation(root);
}

AVLTree LRrotation(AVLNode *root) {
	AVLNode *temp = root->left;
	root->left = RRrotation(temp);
	return LLrotation(root);
}
AVLTree InsertNode( AVLNode *root, AVLNode *p ) {
	//把p插入到以root为根结点的AVL树中
	if (!root) {
		p->height = 1;
		return p;
	}
	if (p->val > root->val) {
		root->right = InsertNode(root->right, p);
		//右子树上插入了一个结点,然后判断左右子树的高度差是否已经需要调整
		if (GetHeight(root->left) - GetHeight(root->right) == -2) {
			if (p->val > root->right->val) {
				//在某结点的右孩子的右子树上插入了一个结点导致失衡,应进行左单旋转
				//RR旋转
				root = RRrotation(root);
			}
			else if (p->val < root->right->val) {
				root = RLrotation(root);
			}
		}
	}
	else if (p->val < root->val) {
		root->left = InsertNode(root->left, p);
		if (GetHeight(root->left) - GetHeight(root->right) == 2) {
			if (p->val > root->left->val) {
				//在某结点的左孩子的右子树上插入了一个结点导致失衡,应进行LR旋转
				root = LRrotation(root);
			}
			else if (p->val < root->left->val) {
				root = LLrotation(root);
			}
		}
	}
	return root;
}
int main() {
	int n;
	cin >> n;
	AVLNode *root = nullptr;
	while (n--) {
		int t;
		cin >> t;
		AVLNode *temp = new AVLNode(t);
		root = InsertNode(root, temp);
	}
	cout << root->val << endl;
}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值