题目翻译:
给定插入序列,构建AVL(二叉平衡树),输出AVL树的根结点的值
题解思路:
结合4种旋转操作构建即可
代码:
#include<bits/stdc++.h>
using namespace std;
struct node {
int data, leftheight, rightheight;
node* lchild, * rchild;
};
void insert(node*& root, int i)
{
if (root == NULL){
root = new node;
root->data = i;
root->lchild = root->rchild = NULL;
root->leftheight = root->rightheight = 0;
}
else {
if (i > root->data){
insert(root->rchild, i);
root->rightheight = max(root->rchild->leftheight, root->rchild->rightheight) + 1;
}
else{
insert(root->lchild, i);
root->leftheight = max(root->lchild->leftheight, root->lchild->rightheight) + 1;
}
}//插入结点,以及高度更新
if (root->leftheight - root->rightheight == 2) {//左边问题
if (root->lchild->leftheight > root->lchild->rightheight) {//左左LL
node* a = root;
node* b = root->lchild;
root = b;
a->lchild = b->rchild;
a->leftheight = b->rightheight;
b->rchild = a;
b->rightheight += 1;
}
else {//左右LR
node* a = root;
node* b = root->lchild;
node* c = root->lchild->rchild;
root = c;
b->rchild = c->lchild;
b->rightheight = c->leftheight;
a->lchild = c->rchild;
a->leftheight = c->rightheight;
c->lchild = b;
c->rchild = a;
c->leftheight = b->leftheight + 1;
c->rightheight = a->rightheight + 1;
}
}
else if (root->rightheight - root->leftheight == 2){//右边问题
if (root->rchild->leftheight < root->rchild->rightheight){//右右RR
node* a = root;
node* b = root->rchild;
root = b;
a->rchild = b->lchild;
a->rightheight = b->leftheight;
b->lchild = a;
b->leftheight += 1;
}
else {//右左RL
node* a = root;
node* b = root->rchild;
node* c = root->rchild->lchild;
root = c;
b->lchild = c->rchild;
b->leftheight = c->rightheight;
a->rchild = c->lchild;
a->rightheight = c->leftheight;
c->rchild = b;
c->lchild = a;
c->rightheight = b->rightheight + 1;
c->leftheight = a->leftheight + 1;
}
}
}
int main()
{
int N, i;
node* Tree = NULL;
cin >> N;
while (N--){
cin >> i;
insert(Tree, i);
}
cout << Tree->data;
}
坑点:
无