数据结构实验之查找二:平衡二叉树
Time Limit: 400MS
Memory Limit: 65536KB
Problem Description
根据给定的输入序列建立一棵平衡二叉树,求出建立的平衡二叉树的树根。
Input
输入一组测试数据。数据的第1行给出一个正整数N(n <= 20),N表示输入序列的元素个数;第2行给出N个正整数,按数据给定顺序建立平衡二叉树。
Output
输出平衡二叉树的树根。
Example Input
5 88 70 61 96 120
Example Output
70
关于平衡二叉树的教学视频,推荐看:
https://www.icourse163.org/learn/ZJU-93001?tid=120001#/learn/content?type=detail&id=404030&sm=1
代码如下:
#include<bits/stdc++.h>
using namespace std;
struct node
{
int data;
int deep;
struct node *left;
struct node *right;
};
int Deep(struct node *tree)
{
if(!tree)
return -1;
else
return tree->deep;
}
struct node *LL(struct node *tree)
{
struct node *p=tree->left;
tree->left=p->right;
p->right=tree;
p->deep=max(Deep(p->left),Deep(p->right))+1;
tree->deep=max(Deep(tree->left),Deep(tree->right))+1;
return p;
};
struct node *RR(struct node *tree)
{
struct node *p=tree->right;
tree->right=p->left;
p->left=tree;
p->deep=max(Deep(p->left),Deep(p->right))+1;
tree->deep=max(Deep(tree->left),Deep(tree->right))+1;
return p;
};
struct node *LR(struct node *tree)
{
tree->left=RR(tree->left);
return LL(tree);
};
struct node *RL(struct node *tree)
{
tree->right=LL(tree->right);
return RR(tree);
};
struct node *Creat(struct node *tree,int n)
{
if(!tree)
{
tree=new node;
tree->deep=0;
tree->data=n;
tree->left=NULL;
tree->right=NULL;
}
else if(tree->data>n)
{
tree->left=Creat(tree->left,n);
if(Deep(tree->left)-Deep(tree->right)>1)
{
if(tree->left->data>n)
{
tree=LL(tree);
}
else
{
tree=LR(tree);
}
}
}
else if(tree->data<=n)
{
tree->right=Creat(tree->right,n);
if(Deep(tree->right)-Deep(tree->left)>1)
{
if(tree->right->data<n)
{
tree=RR(tree);
}
else
{
tree=RL(tree);
}
}
}
tree->deep=max(Deep(tree->left),Deep(tree->right))+1;
return tree;
};
int main()
{
int n,m,i;
cin>>n;
struct node *tree=NULL;
for(i=0;i<n;i++)
{
cin>>m;
tree=Creat(tree,m);
}
cout<<tree->data<<endl;
return 0;
}