欢迎访问我的pat甲级题解目录哦 https://blog.csdn.net/richenyunqi/article/details/84981078
题目描述
算法设计
可以参考我的AVL树代码模板,直接套用即可。
C++代码
#include<bits/stdc++.h>
using namespace std
;
struct AVLTreeNode
{
int data
,height
;
AVLTreeNode
*left
,*right
;
AVLTreeNode(int value
, AVLTreeNode
*l
=nullptr, AVLTreeNode
*r
=nullptr):data(value
), height(0),left(l
),right(r
) {}
};
int getHeight(AVLTreeNode
*r
){
return r
==nullptr?0:r
->height
;
}
AVLTreeNode
*findAVL(AVLTreeNode
*root
,int data
){
if (root
==nullptr || root
->data
==data
)
return root
;
if (data
< root
->data
)
return findAVL(root
->left
, data
);
else
return findAVL(root
->right
, data
);
}
AVLTreeNode
* leftLeftRotation(AVLTreeNode
* k2
){
AVLTreeNode
* k1
= k2
->left
;
k2
->left
= k1
->right
;
k1
->right
= k2
;
k2
->height
= max(getHeight(k2
->left
), getHeight(k2
->right
)) + 1;
k1
->height
= max(getHeight(k1
->left
), k2
->height
) + 1;
return k1
;
}
AVLTreeNode
* rightRightRotation(AVLTreeNode
* k1
){
AVLTreeNode
* k2
= k1
->right
;
k1
->right
= k2
->left
;
k2
->left
= k1
;
k1
->height
= max( getHeight(k1
->left
), getHeight(k1
->right
)) + 1;
k2
->height
= max( getHeight(k2
->right
), k1
->height
) + 1;
return k2
;
}
AVLTreeNode
* leftRightRotation(AVLTreeNode
* k3
){
k3
->left
= rightRightRotation(k3
->left
);
return leftLeftRotation(k3
);
}
AVLTreeNode
* rightLeftRotation(AVLTreeNode
* k1
){
k1
->right
= leftLeftRotation(k1
->right
);
return rightRightRotation(k1
);
}
AVLTreeNode
* insertNode(AVLTreeNode
* &root
, int data
){
if (root
== nullptr)
root
= new AVLTreeNode(data
);
else if (data
< root
->data
){
root
->left
= insertNode(root
->left
, data
);
if (getHeight(root
->left
) - getHeight(root
->right
) == 2){
if (data
< root
->left
->data
)
root
= leftLeftRotation(root
);
else
root
= leftRightRotation(root
);
}
}else if (data
> root
->data
){
root
->right
= insertNode(root
->right
, data
);
if (getHeight(root
->right
) - getHeight(root
->left
) == 2){
if (data
> root
->right
->data
)
root
= rightRightRotation(root
);
else
root
= rightLeftRotation(root
);
}
}else
cout
<< "添加失败:不允许添加相同的节点!" << endl
;
root
->height
= max( getHeight(root
->left
), getHeight(root
->right
)) + 1;
return root
;
}
int main(){
int N
,a
;
scanf("%d",&N
);
AVLTreeNode
*root
=nullptr;
for (int i
=0;i
<N
;++i
) {
scanf("%d",&a
);
root
=insertNode(root
,a
);
}
printf("%d",root
->data
);
return 0;
}
转载请注明原文地址: https://win8.8miu.com/read-1459112.html