数据结构实验之查找二:平衡二叉树
Time Limit: 400MS Memory Limit: 65536KB
Submit Statistic
Problem Description
根据给定的输入序列建立一棵平衡二叉树,求出建立的平衡二叉树的树根。
Input
输入一组测试数据。数据的第1行给出一个正整数N(n <= 20),N表示输入序列的元素个数;第2行给出N个正整数,按数据给定顺序建立平衡二叉树。
Output
输出平衡二叉树的树根。
Example Input
5
88 70 61 96 120
Example Output
70
Hint
Author
xam
#include <iostream>
#include <stdio.h>
using namespace std;
const int MAX = 15;
typedef struct node
{
int ndata;
node *l, *r;
int nheight;
} t, *pt;
int mmax(int a, int b)
{
return a > b ? a : b;
}
int height(pt p)
{
if(p == NULL)
return -1;
return p->nheight;
}
pt lltree(pt p)
{
pt p1;
p1 = p->l;
p->l = p1->r;
p1->r = p;
p->nheight = mmax(height(p->l), height(p->r)) + 1;
p1->nheight = mmax(height(p1->l), p->nheight) + 1;
return p1;
}
pt rrtree(pt p)
{
pt p1;
p1 = p->r;
p->r = p1->l;
p1->l = p;
p->nheight = mmax(height(p->l), height(p->r)) + 1;
p1->nheight = mmax(height(p1->r), p->nheight) + 1;
return p1;
}
pt lrtree(pt p)
{
p->l = rrtree(p->l);
return lltree(p);
}
pt rltree(pt p)
{
p->r = lltree(p->r);
return rrtree(p);
}
pt creat(pt root, int x)
{
if(root == NULL)
{
root = new t();
root->ndata = x;
root->r = root->l = NULL;
root->nheight = 0;
}
else if(x < root->ndata)
{
root->l = creat(root->l, x);
if(height(root->l) - height(root->r) == 2)
{
if(x < root->l->ndata)
{
root = lltree(root);
}
else root = lrtree(root);
}
}
else if(x > root->ndata)
{
root->r = creat(root->r, x);
if(height(root->l) - height(root->r) == -2)
{
if(x > root->r->ndata)
{
root = rrtree(root);
}
else root = rltree(root);
}
}
root->nheight = mmax(height(root->l), height(root->r)) + 1;
return root;
}
int main()
{
int n;
while(cin >> n)
{
pt root = NULL;
while(n--)
{
int x;
cin >> x;
root = creat(root, x);
}
cout << root->ndata << endl;
}
return 0;
}