#include <bits/stdc++.h>
using namespace std;
vector<int> son[1000005];
int num[1000005], p[1000005], p2[1000005];
int st[1000005], top;
int l[1000005], r[1000005];
bool findfather(int n) {
  memset(p, 0, sizeof(p));
  memset(p2, 0, sizeof(p2));
  memset(l, 0x3f, sizeof(l));
  memset(r, 0, sizeof(r));
  for (int i = 1; i <= 2 * n - 1; i++)
    if (num[i]) {
      l[num[i]] = min(l[num[i]], i);
      r[num[i]] = max(r[num[i]], i);
    }
  top = 0;
  for (int i = 1; i <= 2 * n - 1; i++)
    if (!num[i] || i == l[num[i]])
      st[++top] = i;
    else {
      while (num[st[top]] != num[i]) {
        if (num[st[top]] && st[top] < r[num[st[top]]]) return 0;
        if (num[st[top]])
          p[num[st[top]]] = num[i];
        else
          p2[st[top]] = num[i];
        top--;
      }
      st[top] = i;
    }
  return 1;
}
bool vis[500005];
int rx = 1;
int newnum() {
  while (vis[rx]) rx++;
  vis[rx] = 1;
  return rx;
}
int st2[1000005], top2;
bool cur[1000005];
void col2(int x, int l, int r) {
  st[top = 1] = x;
  for (int i = l + 1; i < r; i++) cur[i] = (!num[son[x][i - 1]]);
  for (int i = l + 1; i < r; i++) {
    int u = son[x][i];
    if (num[u]) {
      if (cur[i]) st[++top] = num[u];
    } else if (top > 1)
      num[u] = st[--top];
    else {
      num[u] = newnum();
      st[++top] = num[u];
    }
  }
}
void col1(int x) {
  top = top2 = 0;
  int last2 = -1;
  for (int i = 0; i < son[x].size(); i++) {
    int u = son[x][i];
    if (num[u] == x) {
      if (last2 != -1) col2(x, last2, i);
      st[top = 1] = x;
      top2 = 0;
      last2 = i;
    } else if (num[u]) {
      while (top && top2) {
        num[st2[top2]] = num[u];
        if (num[st2[top2] - 1])
          st[top] = num[st2[top2] - 1];
        else
          top--;
        top2--;
      }
      st[++top] = num[u];
    } else if (top > 1)
      num[u] = st[--top];
    else {
      st2[++top2] = u;
      top = 0;
    }
  }
}
bool dfs(int x) {
  int s = 0;
  for (int i = 0; i < son[x].size(); i++) {
    int u = son[x][i];
    if (num[u] == x) {
      if (s > 1) return 0;
      s = 0;
    } else if (num[u]) {
      if (!dfs(num[u])) return 0;
      s++;
    } else
      s--;
  }
  col1(x);
  return 1;
}
bool findroot(int n) {
  int s1 = 0, s2 = 0;
  for (int i = 2; i < 2 * n - 1; i++)
    if (!num[i]) {
      if (!p2[i]) s1--;
    } else {
      if (!p[num[i]] && i == l[num[i]]) s1++;
    }
  if (s1 <= 1) {
    for (int i = 1; i <= n; i++)
      if (!r[i]) {
        num[1] = num[2 * n - 1] = i;
        return 1;
      }
  }
  for (int i = 2; i < 2 * n - 1; i++) {
    if (num[i] && !p[num[i]] && i == l[num[i]] && s2 <= 1 && s1 - s2 - 1 <= 1) {
      num[1] = num[2 * n - 1] = num[i];
      return 1;
    }
    if (!num[i]) {
      if (!p2[i]) s2--;
    } else {
      if (!p[num[i]] && i == l[num[i]]) s2++;
    }
  }
  return 0;
}
bool solve(int n) {
  if (num[1] && num[2 * n - 1] && num[1] != num[2 * n - 1]) return 0;
  if (!num[1]) num[1] = num[2 * n - 1];
  if (!num[2 * n - 1]) num[2 * n - 1] = num[1];
  for (int i = 1; i < 2 * n - 1; i++)
    if (num[i] && num[i] == num[i + 1]) return 0;
  if (!findfather(n)) return 0;
  if (!num[1]) {
    if (!findroot(n)) return 0;
    if (!findfather(n)) return 0;
  }
  for (int i = 1; i <= 2 * n - 1; i++)
    if (!num[i])
      son[p2[i]].push_back(i);
    else {
      son[num[i]].push_back(i);
      if (p[num[i]] && i == l[num[i]]) son[p[num[i]]].push_back(i);
      vis[num[i]] = 1;
    }
  if (!dfs(num[1])) return 0;
  return 1;
}
int main() {
  int n;
  scanf("%d", &n);
  for (int i = 1; i <= 2 * n - 1; i++) scanf("%d", &num[i]);
  if (!solve(n)) {
    puts("no");
    return 0;
  }
  puts("yes");
  for (int i = 1; i <= 2 * n - 1; i++) printf("%d ", num[i]);
  printf("\n");
  return 0;
}
