PAT甲级1066

1066 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.

 

 

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 Ndistinct 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

参考晴神笔记

#include<bits/stdc++.h>
using namespace std;

struct Node{
	int wei, high;
	Node* lchild;
	Node* rchild;
}*root;

Node* newNode(int wei){
	Node* node = new Node;
	node->wei = wei;
	node->high = 1;
	node->lchild = NULL;
	node->rchild = NULL;
	return node;
}

int geth(Node* root){
	if(root == NULL)
		return 0;
	return root->high;
}

void updateh(Node* root){
	root->high = max(geth(root->lchild), geth(root->rchild)) + 1;
}

int getb(Node* root){
	return geth(root->lchild) - geth(root->rchild);
}

void L(Node* &root){
	Node* temp = root->rchild;
	root->rchild = temp->lchild;
	temp->lchild = root;
	updateh(root);
	updateh(temp);
	root = temp;
}

void R(Node* &root){
	Node* temp = root->lchild;
	root->lchild = temp->rchild;
	temp->rchild = root;
	updateh(root);
	updateh(temp);
	root = temp;
}

void insert(Node* &root, int wei){
	if(root == NULL){
		root = newNode(wei);
		return;
	}
	if(wei < root->wei){
		insert(root->lchild, wei);
		updateh(root);
		if(getb(root) == 2){
			if(getb(root->lchild) == 1){
				R(root);
			}
			else if(getb(root->lchild) == -1){
				L(root->lchild);
				R(root);
			}
		}
	}
	else{
		insert(root->rchild, wei);
		updateh(root);
		if(getb(root) == -2){
			if(getb(root->rchild) == -1){
				L(root);
			}
			else if(getb(root->rchild) == 1){
				R(root->rchild);
				L(root);
			}
		}
	}
}

int main(){
	int n, wei;
	scanf("%d", &n);
	root = NULL;
	for(int i = 0; i < n; i++){
		scanf("%d", &wei);
		insert(root, wei);
	}
	printf("%d", root->wei);
	return 0;
}
发布了116 篇原创文章 · 获赞 7 · 访问量 6036

猜你喜欢

转载自blog.csdn.net/qq_40204582/article/details/86772992