忘记参考哪个博客写的了哎
错误://以下这两个函数不知道怎么写出来的,总是错,其实就还是想不太清楚,右左旋 左右旋 搞不清楚
pTree RLrotate(pTree p){
p->Right = LLrotate(p->Right);
return RRrotate(p);
}
pTree LRrotate(pTree p){
p->Left = RRrotate(p->Left);
return LLrotate(p);
}
错误:指针要初始化才能带入函数
int main(){
int n,v;
pTree p = NULL;//忘记初始化为空了
cin>>n;
for(int i=0;i<n;++i){
cin>>v;
p = Insert(p,v);
}
cout<<p->Data<<endl;
return 0;
}
#include<iostream>
#include<cmath>
using namespace std;
typedef struct TreeNode *pTree;//forget the struct
struct TreeNode{
int Data;
pTree Left,Right;
int height;
TreeNode(int v):Data(v),Left(NULL),Right(NULL),height(0){
}//forget height(0)
// TreeNode():Left(NULL),Right(NULL){}
};
int GetHeight(pTree p){
if(!p) return -1;
else return p->height;
}
int Max(int a,int b){
return a>b? a:b;}
pTree LLrotate(pTree p){
pTree rl;
rl = p->Left;
p->Left = rl->Right;
rl->Right = p;
p->height = Max(GetHeight(p->Right),GetHeight(p->Left))+1;
rl->height = Max(GetHeight(rl->Right),GetHeight(rl->Left))+1;
return rl;
}
pTree RRrotate(pTree p){
pTree rr;
rr = p->Right;
p->Right = rr->Left;
rr->Left = p;
p->height = Max(GetHeight(p->Right),GetHeight(p->Left))+1;
rr->height = Max(GetHeight(rr->Right),GetHeight(rr->Left))+1;
return rr;
}
//以下这两个函数不知道怎么写出来的,总是错,其实就还是想不太清楚
pTree RLrotate(pTree p){
p->Right = LLrotate(p->Right);
return RRrotate(p);
}
pTree LRrotate(pTree p){
p->Left = RRrotate(p->Left);
return LLrotate(p);
}
bool Balanced(pTree left,pTree right){
return abs(GetHeight(left)-GetHeight(right))<2;
}
pTree Insert(pTree p,int v){
if(!p){
p = new TreeNode(v);//read new relative
return p;
}
if(p->Data>v){
p->Left = Insert(p->Left,v);
if(!Balanced(p->Left,p->Right)){
//可是检查树是不是平衡不应该检查每个节点么?
if(v<p->Left->Data){
p = LLrotate(p);
}
else{
p = LRrotate(p);
}
}
}
else{
//wrong used else(p->Data<v) else后面不能加条件哦
p->Right = Insert(p->Right,v);
if(!Balanced(p->Left,p->Right)){
if(v>p->Right->Data){
p = RRrotate(p);
}
else{
p = RLrotate(p);
}
}
}
p->height = Max(GetHeight(p->Right),GetHeight(p->Left))+1;
return p;
}
int main(){
int n,v;
pTree p = NULL;//忘记初始化为空了
cin>>n;
for(int i=0;i<n;++i){
cin>>v;
p = Insert(p,v);
}
cout<<p->Data<<endl;
return 0;
}