Java
import java.io.*;
import java.util.*;
public class Main {
    static final int N = 30;
    static int n;
    static int[] l = new int[N];    // 左子节点
    static int[] r = new int[N];    // 右子节点
    static int[] v = new int[N];    // 节点值
    static int[] h = new int[N];    // 高度
    static int idx;                 // 节点索引
    static int[] level = new int[N];
    static int[] pos = new int[N];  // 节点位置
    static boolean flag = true;
    // 更新节点高度
    static void update(int u) {
        h[u] = Math.max(h[l[u]], h[r[u]]) + 1;
    }
    // 计算平衡因子
    static int BF(int u) {
        return h[l[u]] - h[r[u]];
    }
    // 左旋操作
    static void L(IntWrapper u) {
        int p = r[u.value];
        r[u.value] = l[p];
        l[p] = u.value;
        update(u.value);
        update(p);
        u.value = p;
    }
    // 右旋操作
    static void R(IntWrapper u) {
        int p = l[u.value];
        l[u.value] = r[p];
        r[p] = u.value;
        update(u.value);
        update(p);
        u.value = p;
    }
    // 插入节点
    static void insert(IntWrapper u, int w) {
        if (u.value == 0) {
            u.value = ++idx;
            v[u.value] = w;
        } else if (w < v[u.value]) {
            IntWrapper lu = new IntWrapper(l[u.value]);
            insert(lu, w);
            l[u.value] = lu.value;
            if (BF(u.value) == 2) {
                if (BF(l[u.value]) == 1) {
                    R(u);
                } else {
                    IntWrapper lu2 = new IntWrapper(l[u.value]);
                    L(lu2);
                    l[u.value] = lu2.value;
                    R(u);
                }
            }
        } else {
            IntWrapper ru = new IntWrapper(r[u.value]);
            insert(ru, w);
            r[u.value] = ru.value;
            if (BF(u.value) == -2) {
                if (BF(r[u.value]) == -1) {
                    L(u);
                } else {
                    IntWrapper ru2 = new IntWrapper(r[u.value]);
                    R(ru2);
                    r[u.value] = ru2.value;
                    L(u);
                }
            }
        }
        update(u.value);
    }
    // BFS遍历
    static void bfs(int u) {
        Queue<Integer> q = new LinkedList<>();
        q.offer(u);
        pos[u] = 1;
        boolean isFirst = true;
        StringBuilder sb = new StringBuilder();
        while (!q.isEmpty()) {
            int t = q.poll();
            if (isFirst) {
                isFirst = false;
            } else {
                sb.append(" ");
            }
            sb.append(v[t]);
            if (pos[t] > n) flag = false;
            if (l[t] != 0) {
                q.offer(l[t]);
                pos[l[t]] = 2 * pos[t];
            }
            if (r[t] != 0) {
                q.offer(r[t]);
                pos[r[t]] = 2 * pos[t] + 1;
            }
        }
        System.out.println(sb);
    }
    // 包装类用于模拟C++的引用传递
    static class IntWrapper {
        int value;
        IntWrapper(int value) {
            this.value = value;
        }
    }
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        n = Integer.parseInt(br.readLine());
        IntWrapper root = new IntWrapper(0);
        String[] inputs = br.readLine().split(" ");
        for (int i = 0; i < n; i++) {
            insert(root, Integer.parseInt(inputs[i]));
        }
        bfs(root.value);
        System.out.println(flag ? "YES" : "NO");
        br.close();
    }
}
C++
#include <iostream>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;
const int N = 30;
int n;
int l[N], r[N], v[N], h[N], idx;
int level[N], pos[N];
bool flag = true;
void update(int u) {
    h[u] = max(h[l[u]], h[r[u]]) + 1;
}
int BF(int u) {
    return h[l[u]] - h[r[u]];
}
void L(int &u) {
    int p = r[u];
    r[u] = l[p], l[p] = u;
    update(u), update(p);
    u = p;
}
void R(int &u) {
    int p = l[u];
    l[u] = r[p], r[p] = u;
    update(u), update(p);
    u = p;
}
void insert(int &u, int w) {
    if (!u) {
        u = ++idx;
        v[u] = w;
    } else if (w < v[u]) {
        insert(l[u], w);
        if (BF(u) == 2) {
            if (BF(l[u]) == 1) R(u);
            else L(l[u]), R(u);
        }
    } else {
        insert(r[u], w);
        if (BF(u) == -2) {
            if (BF(r[u]) == -1) L(u);
            else R(r[u]), L(u);
        }
    }
    update(u);
}
void bfs(int u) {
    queue<int> q;
    q.push(u);
    pos[u] = 1;
    bool is_first = true;
    while (!q.empty()) {
        int t = q.front();
        q.pop();
        if (is_first) is_first = false;
        else printf(" ");
        printf("%d", v[t]);
        if (pos[t] > n) flag = false;
        if (l[t]) {
            q.push(l[t]);
            pos[l[t]] = 2 * pos[t];
        }
        if (r[t]) {
            q.push(r[t]);
            pos[r[t]] = 2 * pos[t] + 1;
        }
    }
    printf("\n");
}
int main() {
    scanf("%d", &n);
    int root = 0;
    for (int i = 0; i < n; ++i) {
        int x;
        scanf("%d", &x);
        insert(root, x);
    }
    bfs(root);
    if (flag) printf("YES\n");
    else printf("NO\n");
    return 0;
};