#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 10;
int n, m;
int a[N], num[N];
int rpos[N];
vector<int> pos[N];
void fail() {
  puts("no");
  exit(0);
}
void DFS_init(int l, int r) {
  int cnt = 0, len = 0;
  for (int i = l + 1; i <= r - 1; i++) {
    int x = a[i];
    if (x) {
      if (rpos[x] > r) fail();
      int lst = 0;
      for (int p : pos[x]) {
        if (lst) DFS_init(lst, p);
        lst = p;
      }
      i = rpos[x];
      ++cnt;
    }
    ++len;
  }
  ++len;
  if (l == 1 && !a[1]) len += 2;
  if (len / 2 < cnt || len % 2) fail();
  int c = len / 2 - cnt;
  if (l == 1 && !a[1] && !c) {
    int _cnt = 0, _len = 0;
    for (int i = l + 1; i <= r - 1; i++) {
      int x = a[i];
      ++_len;
      if (x) {
        i = rpos[x];
        if (_len % 2 == 0 && _cnt * 2 == _len) {
          a[1] = x;
          break;
        }
        ++_cnt;
      }
    }
  }
  if (l == 1 && !a[1]) --l, ++r;
  for (int i = l + 1; i <= r - 1; i++) {
    if (!c) break;
    int x = a[i];
    if (!x)
      a[i] = num[m--], --c;
    else
      i = rpos[x];
  }
  a[2 * n - 1] = a[1];
}
int nxt[N], pre[N];
void DFS_work(int l, int r) {
  assert(a[l] == a[r]);
  vector<int> vec;
  for (int i = l + 1; i <= r - 1; i++) {
    int x = a[i];
    if (x) {
      int lst = 0;
      for (int p : pos[x]) {
        if (lst) DFS_work(lst, p);
        lst = p;
      }
      i = rpos[x];
    }
    vec.push_back(i);
  }
  pre[l] = nxt[r] = 0;
  int lst = l;
  for (int x : vec) pre[x] = lst, nxt[lst] = x, lst = x;
  nxt[lst] = r, pre[r] = lst;
  for (int o = nxt[l]; o < r; o = nxt[o])
    while (a[pre[o]] && a[o] && !a[nxt[o]]) {
      a[nxt[o]] = a[pre[o]];
      int v = nxt[nxt[o]];
      nxt[pre[o]] = v, pre[v] = pre[o];
      o = pre[o];
    }
  for (int o = pre[r]; o > l; o = pre[o])
    while (!a[pre[o]] && a[o] && a[nxt[o]]) {
      a[pre[o]] = a[nxt[o]];
      int v = pre[pre[o]];
      pre[nxt[o]] = v, nxt[v] = nxt[o];
      o = nxt[o];
    }
}
int main() {
  scanf("%d", &n);
  for (int i = 1; i <= 2 * n - 1; i++) scanf("%d", &a[i]);
  if (n == 1) a[1] = 1;
  if (a[1] && a[2 * n - 1] && a[1] != a[2 * n - 1]) fail();
  a[1] = a[2 * n - 1] = max(a[1], a[2 * n - 1]);
  for (int i = 1; i <= 2 * n - 1; i++)
    if (a[i]) {
      pos[a[i]].push_back(i);
      rpos[a[i]] = i;
    }
  for (int i = 1; i <= n; i++)
    if (!rpos[i]) num[++m] = i;
  if (!a[1])
    DFS_init(1, 2 * n - 1);
  else {
    int x = a[1], lst = 0;
    for (int p : pos[x]) {
      if (lst) DFS_init(lst, p);
      lst = p;
    }
  }
  if (m) fail();
  for (int i = 1; i <= n; i++) pos[i].clear();
  for (int i = 1; i <= 2 * n - 1; i++)
    if (a[i]) {
      pos[a[i]].push_back(i);
      rpos[a[i]] = i;
    }
  int x = a[1], lst = 0;
  for (int p : pos[x]) {
    if (lst) DFS_work(lst, p);
    lst = p;
  }
  puts("yes");
  for (int i = 1; i <= 2 * n - 1; i++)
    printf("%d%c", a[i], i == 2 * n - 1 ? '\n' : ' ');
  return 0;
}
