#include <bits/stdc++.h>
using namespace std;
const int maxn = 2e6 + 10, mod = 1e9 + 7;
const long long inf = 1e18;
void No(int num) {
  cout << "no\n";
  exit(0);
}
void Assert(bool bl, int num) {
  if (!bl) cout << "ERROR_" << num << endl, exit(0);
}
int a[maxn], nxt[maxn], pre[maxn], lst[maxn], n;
vector<pair<int, int> > v, vec, vec2;
int par[maxn], col[maxn];
int Find(int u) {
  if (par[u] < 0) return u;
  return par[u] = Find(par[u]);
}
void Merge(int a, int b) {
  if ((a = Find(a)) == (b = Find(b))) return;
  if (col[a] != col[b]) Assert(col[a] > n || col[b] > n, 3);
  if (col[b] > n) Assert(col[a] > n, 4);
  if (par[a] < par[b]) {
    par[a] += par[b];
    par[b] = a;
    col[a] = col[b];
  } else {
    par[b] += par[a];
    par[a] = b;
  }
}
void Merge(pair<int, int> x, pair<int, int> y) {
  if (col[Find(a[x.second])] <= n) swap(x, y);
  Merge(a[x.second], a[y.second]);
  int A = col[Find(a[x.second])], B = col[Find(a[y.second])];
  if (A <= n && B <= n) Assert(A == B, 5);
}
void solve(vector<pair<int, int> >& vec) {
  vec2.clear();
  vec2.push_back(vec[0]);
  vec2.push_back(vec[1]);
  for (int i = 2; i < int((vec).size()) - 1; i++) {
    if (col[Find(a[vec[i].second])] > n && int((vec2).size()) > 1 &&
        col[Find(a[vec2.back().second])] <= n) {
      Merge(vec2[int((vec2).size()) - 2], vec[i]);
      vec2.pop_back();
      vec2[int((vec2).size()) - 1].second = vec[i].second;
    } else {
      vec2.push_back(vec[i]);
    }
  }
  vec2.push_back(vec.back());
  vec.clear();
  reverse(vec2.begin(), vec2.end());
  vec.push_back(vec2[0]);
  vec.push_back(vec2[1]);
  for (int i = 2; i < int((vec2).size()) - 1; i++) {
    if (col[Find(a[vec2[i].second])] > n && int((vec).size()) > 1 &&
        col[Find(a[vec.back().second])] <= n) {
      Merge(vec2[i], vec[int((vec).size()) - 2]);
      vec.pop_back();
      vec[int((vec).size()) - 1].first = vec2[i].first;
    } else {
      vec.push_back(vec2[i]);
    }
  }
  vec.push_back(vec2.back());
  vec2.clear();
  reverse(vec.begin(), vec.end());
  if (col[Find(a[vec[1].second])] <= n && int((vec).size()) > 3) No(1);
  vec2.push_back(vec[0]);
  for (int i = 1; i < int((vec).size()); i++) {
    if (int((vec2).size()) > 1) {
      Merge(vec2[0], vec[i]);
      vec2.pop_back();
      vec2[int((vec2).size()) - 1].second = vec[i].second;
    } else {
      vec2.push_back(vec[i]);
    }
  }
  vec = vec2;
  Assert(int((vec).size()) == 1, 1);
}
int sm[maxn];
set<int> st;
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  memset(par, -1, sizeof par);
  memset(nxt, -1, sizeof nxt);
  memset(pre, -1, sizeof pre);
  memset(lst, -1, sizeof lst);
  for (int i = 0; i < maxn; i++) col[i] = i;
  cin >> n;
  for (int i = 1; i <= n; i++) st.insert(i);
  int C = n;
  for (int i = 0; i < 2 * n - 1; i++) {
    cin >> a[i];
    if (a[i] == 0) a[i] = ++C;
    pre[i] = lst[a[i]];
    if (pre[i] != -1) nxt[pre[i]] = i;
    lst[a[i]] = i;
    st.erase(a[i]);
  }
  if (a[0] <= n && a[2 * n - 2] <= n && a[0] != a[2 * n - 2]) No(3);
  for (int i = 0; i < 2 * n - 1; i++) {
    if (pre[i] == -1) {
      v.push_back({i, i});
      continue;
    }
    vec.clear();
    vec.push_back({i, i});
    while (pre[i] < v.back().second) {
      vec.push_back(v.back());
      v.pop_back();
    }
    if (v.empty() || v.back().second != pre[i] || int((vec).size()) & 1) No(2);
    vec.push_back(v.back());
    int NUM = v.back().first;
    v.pop_back();
    v.push_back({NUM, i});
    reverse(vec.begin(), vec.end());
    solve(vec);
  }
  if (int((v).size()) > 1) {
    Merge(v[0], v[int((v).size()) - 1]);
    if (col[Find(a[v[0].second])] > n) {
      for (int i = 1; i < int((v).size()); i++) {
        sm[i] = sm[i - 1] + (col[Find(a[v[i].second])] <= n ? 1 : -1);
      }
      int id = -1;
      for (int i = 1; i < int((v).size()) - 1; i++) {
        if ((i & 1) == 0 && col[Find(a[v[i].second])] <= n && sm[i - 1] <= 1 &&
            sm[int((v).size()) - 2] - sm[i] <= 1)
          id = i;
      }
      if (id != -1) {
        Merge(v[0], v[id]);
        vec.clear();
        for (int i = 0; i <= id; i++) vec.push_back(v[i]);
        solve(vec);
        vec.clear();
        vec.push_back({0, v[id].second});
        for (int i = id + 1; i < int((v).size()); i++) vec.push_back(v[i]);
        solve(vec);
      } else {
        if (st.empty()) No(4);
        int num = *st.begin();
        st.erase(st.begin());
        col[Find(a[v[0].second])] = num;
        solve(v);
      }
    } else {
      solve(v);
    }
  }
  for (int i = 0; i < 2 * n - 1; i++) {
    int num = Find(a[i]);
    if (col[num] <= n) continue;
    Assert(!st.empty(), 2);
    col[num] = *st.begin();
    st.erase(st.begin());
  }
  cout << "yes\n";
  for (int i = 0; i < 2 * n - 1; i++) {
    int num = col[Find(a[i])];
    cout << num << " ";
  }
  return cout << endl, 0;
}
