#include <bits/stdc++.h>
using namespace std;
template <typename T1, typename T2>
inline T1 max(T1 a, T2 b) {
  return b < a ? a : b;
}
template <typename T1, typename T2>
inline T1 min(T1 a, T2 b) {
  return a < b ? a : b;
}
namespace ae86 {
const int bufl = 1 << 15;
char buf[bufl], *s = buf, *t = buf;
inline int fetch() {
  if (s == t) {
    t = (s = buf) + fread(buf, 1, bufl, stdin);
    if (s == t) return EOF;
  }
  return *s++;
}
inline int ty() {
  int a = 0, b = 1, c = fetch();
  while (!isdigit(c)) b ^= c == '-', c = fetch();
  while (isdigit(c)) a = a * 10 + c - 48, c = fetch();
  return b ? a : -a;
}
}  // namespace ae86
using ae86::ty;
inline void failure() {
  puts("no");
  exit(0);
}
const int _ = 500007, __ = _ << 1;
int n, nn, val[__], ll[__], rr[__], ed[__] = {0};
int las[_] = {0}, nex[__];
void deletes(int l, int r) { ll[rr[r]] = ll[l], rr[ll[l]] = rr[r]; }
inline int putty() {
  static int x = 1;
  while (las[x] != 0 && x <= n) x++;
  if (x > nn) failure();
  las[x] = -1;
  return x;
}
void dfs(int l, int r) {
  if ((r - l) & 1) failure();
  for (int i = l; i <= r; i = rr[i])
    while (nex[i]) {
      if (nex[i] > r) failure();
      dfs(rr[i], ll[nex[i]]), deletes(rr[i], nex[i]), nex[i] = nex[nex[i]];
    }
  int rt = val[ll[l]], len = 0, cnt = 0;
  for (int i = l; i <= r; i = rr[i]) len++, cnt += (val[i] > 0);
  len = (len + 1) >> 1;
  if (len < cnt) failure();
  for (int i = rr[l]; i <= r; i = rr[i])
    if (!val[i] && cnt < len) val[i] = putty(), cnt++;
  if (cnt == 0 && len == 1) val[l] = putty();
  for (int i = l; i <= r; i = rr[i]) {
    while (i > l && rr[i] <= r && !val[ll[i]] && val[i] && val[rr[i]])
      val[ll[i]] = val[rr[i]], deletes(i, rr[i]), i = ll[ll[i]];
    while (i >= l && rr[rr[i]] <= r && val[i] && val[rr[i]] && !val[rr[rr[i]]])
      val[rr[rr[i]]] = val[i], deletes(rr[i], rr[rr[i]]), i = ll[i];
  }
  for (int i = l; i <= r; i = rr[i])
    if (!val[i]) val[i] = rt;
}
int main() {
  n = ty(), nn = n + n - 1;
  for (int i = 1; i <= nn; i++) val[i] = ty();
  if (val[1] && val[nn] && val[1] != val[nn]) failure();
  val[1] = val[nn] = max(val[1], val[nn]);
  for (int i = 1; i <= nn; i++) ll[i] = i - 1, rr[i] = i + 1;
  rr[0] = 1, ll[nn + 1] = nn;
  for (int i = nn; i >= 1; i--)
    if (val[i]) nex[i] = las[val[i]], las[val[i]] = i;
  dfs(1, nn);
  puts("yes");
  for (int i = 1; i <= nn; i++) printf("%d", val[i]), putchar(" \n"[i == nn]);
  return 0;
}
