1123 Is It a Complete AVL Tree
看柳神的代码,非常之简洁,推荐~
解题思路
LL 型的时候:对根节点使用一次右旋(代码中即函数 R()
,意思是进行右旋)
LR 型的时候:对根节点的左节点先进行左旋,再对根节点进行右旋(代码中即函数 LR()
,和形状命名相同)
RR、RL 型同理。
参考代码
using namespace std;
typedef long long LL;
typedef double db;
const int inf = 0x3f3f3f3f;
const LL INF = 1e18;
const int N = 200 + 10;
inline int readint() {int x; scanf("%d", &x); return x;}
struct node{
int val;
node *l, *r;
node() {l = r = NULL;}
};
node* L(node *tree) { //左旋:RR的时候用
node *temp = tree->r;
tree->r = temp->l;
temp->l = tree;
return temp;
}
node *R(node *tree) { //右旋:LL的时候用
node *temp = tree->l;
tree->l = temp->r;
temp->r = tree;
return temp;
}
node *LR(node *tree) {
tree->l = L(tree->l);
return R(tree);
}
node *RL(node *tree) {
tree->r = R(tree->r);
return L(tree);
}
int get_h(node *tree) {
if (tree == NULL) return 0;
int l = get_h(tree->l);
int r = get_h(tree->r);
return max(l, r) + 1;
}
node *insert(node *tree, int val) {
if (tree == NULL) {
tree = new node;
tree->val = val;
}
else if (val < tree->val) {
tree->l = insert(tree->l, val);
int l = get_h(tree->l), r = get_h(tree->r);
if (l - r >= 2) { //LL或LR型
if (val < tree->l->val) { //LL
tree = R(tree);
}
else //LR
tree = LR(tree);
}
}
else {
tree->r = insert(tree->r, val);
int l = get_h(tree->l), r = get_h(tree->r);
if (r - l >= 2) { //RR或RL型
if (val > tree->r->val) //RR
tree = L(tree);
else //RL
tree = RL(tree);
}
}
return tree;
}
int is_complete = 1, after = 0; //after用于判断当前结点之后是不是都要NULL,为1时代表是
VI level_order(node *tree) {
VI ans;
queue<node*> q;
q.push(tree);
while (!q.empty()) {
node *now = q.front();
q.pop();
ans.push_back(now->val);
if (now->l != NULL) {
if (after) {
is_complete = 0;
}
q.push(now->l);
}
else after = 1;
if (now->r != NULL) {
if (after) is_complete = 0;
q.push(now->r);
}
else after = 1;
}
return ans;
}
int main() {
#ifdef LOCAL
freopen("input.txt", "r", stdin);
// freopen("output.txt", "w", stdout);
#endif
int n = readint();
node *root = NULL;
for(int i = 0; i < n; ++i) {
int val = readint();
root = insert(root, val);
}
VI ans;
ans = level_order(root);
for(int i = 0; i < (int)ans.size(); ++i) {
printf("%s%d", i ? " " : "", ans[i]);
}
printf("\n%s", is_complete ? "YES" : "NO");
return 0;
}