题目链接
思路?
主要是参考《算法笔记》一书写的讲解
强力推荐
代码
using namespace std;
#include <iostream>
#include<algorithm>
struct node {
node* left,*right;
int data, h;
node(int d=0) {
h = 1;
data = d;
left = right = NULL;
}
};
int getheight(node* r) {
return r == NULL ? 0 : r->h;
}
int getbalance(node* r) {
return getheight(r->left) - getheight(r->right);
}
void upheight(node* r) {
r->h= max(getheight(r->left) , getheight(r->right))+1;
}
void L(node* &r) {
node* temp = r->right;
r->right = temp->left;
temp->left = r;
upheight(r);
upheight(temp);
r = temp;
}
void R(node* &r) {
node* temp = r->left;
r->left = temp->right;
temp->right = r;
upheight(r);
upheight(temp);
r = temp;
}
void insert(node* &n, int d) {
if (n == NULL) {
n = new node(d);
return;
}
if (d < n->data) {
insert(n->left, d);
upheight(n);
if (getbalance(n) == 2) {
if (getbalance(n->left) == 1) {
R(n);
}
else if (getbalance(n->left) == -1) {
L(n->left);
R(n);
}
}
}
else if (d > n->data) {
insert(n->right, d);
upheight(n);
if (getbalance(n) == -2) {
if (getbalance(n->right) == 1) {
R(n->right);
L(n);
}
else if (getbalance(n->right) == -1) {
L(n);
}
}
}
}
int main() {
int n,temp;
cin >> n;
node* root = NULL;
for (int i = 0; i < n; i++) {
cin >> temp;
insert(root, temp);
}
cout << root->data;
return 0;
}