数据结构实验之查找二:平衡二叉树
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
四种旋转方式如下图
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <iostream>
#include <limits.h>
using namespace std;
typedef struct tree
{
int data;
int d;
tree *left;
tree *right;
}tree;
int max(int x,int y)
{
return x>y?x:y;
}
int deep(tree *root)
{
if(!root)
return -1;
return root->d;
}
void LL(tree *&root)
{
tree *p;
p = root->left;
root->left = p->right;
p->right = root;
root->d = max(deep(root->left),deep(root->right)) + 1;
root = p;
}
void RR(tree *&root)
{
tree *p;
p = root->right;
root->right = p->left;
p->left = root;
root->d = max(deep(root->left),deep(root->right)) + 1;
root = p;
}
void LR(tree *&root)
{
RR(root->left);
LL(root);
}
void RL(tree *&root)
{
LL(root->right);
RR(root);
}
void create(tree *&root,int data)
{
if(!root)
{
root = (tree *)malloc(sizeof(tree));
root->data = data;
root->d = 0;
root->left = root->right = NULL;
}
else if(root->data<data)
{
create(root->right,data);
if(deep(root->right)-deep(root->left)>1)
{
if(root->right->data<data)
RR(root);
else
RL(root);
}
}
else if(root->data>data)//相等不执行!!!!!
{
create(root->left,data);
if(deep(root->left)-deep(root->right)>1)
{
if(root->left->data>data)
LL(root);
else
LR(root);
}
}
root->d = max(deep(root->left),deep(root->right)) + 1;
}
int main()
{
int n;
while(~scanf("%d",&n))
{
tree *root;
root = NULL;
for(int i = 0;i<n;i++)
{
int temp;
scanf("%d",&temp);
create(root,temp);
}
printf("%d\n",root->data);
}
return 0;
}