セグ木を木構造のまま出力する

そのまま配列を出力しても見難いので作った

struct K {
  int l, r, h, k;
};

void SegTree::out() {
  int t = 0, kn = 1;
  while(n > kn) {
    kn *= 2;
    t++;
  }
  int h[t + 1] = {0, 1};
  rep(i, 2, t + 1) h[i] = h[i - 1] * 2 + 1;
  queue<K> q;
  K k = {0, n, 1, 0};
  q.push(k);
  while(!q.empty()) {
    queue<K> nq;
    K pp = q.front();
    if(pp.k > n) break;
    rep(i, 0, h[t]) cout << " ";
    while(!q.empty()) {
      K p = q.front();
      q.pop();
      cout << dat[p.k];
      if(t > 0) rep(i, 0, h[t + 1]) cout << " ";
      else cout << " ";
      K lk = {p.l, (p.l + p.r) / 2, p.h * 2, p.k * 2 + 1};
      K rk = {(p.l + p.r) / 2, p.r, p.h * 2, p.k * 2 + 2};
      nq.push(lk);
      nq.push(rk);
    }
    t--;
    cout << endl;
    q = nq;
  }
}

f:id:deletend:20180117160141p:plain


こんな感じに出力できる

テストケース程度なら問題なさそう?