#include <bits/stdc++.h>
using namespace std;
struct node
{
int data;
int high;
node *lchild, *rchild;
};
int gethigh(node *p)
{
if(!p)
{
return -1;
}
return p -> high;
}
node *RR(node *p)//右子树插入,左旋
{
node *lc = p -> rchild;
p -> rchild = lc -> lchild;
lc -> lchild = p;
p -> high = max(gethigh(p -> lchild), gethigh(p -> rchild))+1;
lc -> high = max(gethigh(lc -> lchild), gethigh(lc -> rchild)) + 1;
return lc;
}
node *LL(node *p)//左子树插入,右旋
{
node *lc = p -> lchild;
p -> lchild = lc -> rchild;
lc -> rchild = p;
p -> high = max(gethigh(p -> lchild), gethigh(p -> rchild))+1;
lc -> high = max(gethigh(lc -> lchild), gethigh(lc -> rchild)) + 1;
return lc;
}
node *LR(node *p)//左子树的右子树插入,先左旋,再右旋
{
p -> lchild = RR(p->lchild);
return LL(p);
}
node *RL(node *p)//相反
{
p -> rchild = LL(p -> rchild);
return RR(p);
}
node *Insert(node *root, int x)
{
if(!root)
{
root = new node;
root -> data = x;
root -> high = 0;
root -> lchild = root -> rchild = NULL;
}
else if(x < root -> data)
{
root -> lchild = Insert(root -> lchild, x);
if(gethigh(root -> lchild) - gethigh(root -> rchild) == 2)
{
if(x < root -> lchild -> data)
{
root = LL(root);
}
else
{
root = LR(root);
}
}
}
else if(x > root -> data)
{
root -> rchild = Insert(root -> rchild, x);
if(gethigh(root -> lchild) - gethigh(root -> rchild) == -2)
{
if(x > root -> rchild -> data)
{
root = RR(root);
}
else
{
root = RL(root);
}
}
}
root -> high = max(gethigh(root -> lchild), gethigh(root -> rchild)) +1;
return root;
}
int main()
{
int n;
node *root = NULL;
cin >> n;
while(n --)
{
int key;
cin >> key;
root = Insert(root, key);
}
cout << root -> data << endl;
return 0;
}
SDUT 3374 数据结构实验之查找二:平衡二叉树
最新推荐文章于 2019-12-08 19:25:40 发布