#include <bits/stdc++.h>
using namespace std;
const int inf = 1e9;
const long long Inf = 1e18;
const int N = 1e6 + 10;
const int mod = 0;
int gi() {
  int x = 0, o = 1;
  char ch = getchar();
  while ((ch < '0' || ch > '9') && ch != '-') ch = getchar();
  if (ch == '-') o = -1, ch = getchar();
  while (ch >= '0' && ch <= '9') x = x * 10 + ch - '0', ch = getchar();
  return x * o;
}
template <typename T>
bool chkmax(T &a, T b) {
  return a < b ? a = b, 1 : 0;
};
template <typename T>
bool chkmin(T &a, T b) {
  return a > b ? a = b, 1 : 0;
};
int add(int a, int b) { return a + b >= mod ? a + b - mod : a + b; }
int sub(int a, int b) { return a - b < 0 ? a - b + mod : a - b; }
void inc(int &a, int b) { a = (a + b >= mod ? a + b - mod : a + b); }
void dec(int &a, int b) { a = (a - b < 0 ? a - b + mod : a - b); }
int n, a[N];
deque<int> mem, st;
void No() {
  puts("no");
  exit(0);
}
void Yes() {
  puts("yes");
  for (int i = 1; i <= 2 * n - 1; i++) printf("%d ", a[i]);
  exit(0);
}
void solve(deque<int> q, int rt) {
  if (q.size() % 2 == 0) No();
  int cnt = 0;
  for (auto i : q)
    if (a[i] > 0) ++cnt;
  int need = (q.size() + 1) / 2;
  if (cnt > need) No();
  for (auto i : q)
    if (!a[i]) {
      if (cnt == need) break;
      ++cnt;
      if (mem.empty()) No();
      a[i] = mem.back();
      mem.pop_back();
    }
  deque<int> st;
  for (auto i : q) {
    if (!a[i]) {
      if (st.size() >= 2 && a[st.back()] && a[st[st.size() - 2]]) {
        st.pop_back();
        a[i] = a[st.back()];
      } else
        st.push_back(i);
    } else {
      while (st.size() >= 2 && a[st.back()] && !a[st[st.size() - 2]]) {
        st.pop_back();
        a[st.back()] = a[i];
        st.pop_back();
      }
      st.push_back(i);
    }
  }
  for (int i = 1; i < st.size(); i++)
    if (!a[st[i]]) a[st[i]] = rt;
}
int vis[N];
void solve(int l, int r) {
  for (int i = l; i <= r; i++) vis[a[i]] = 1;
  for (int i = 1; i <= n; i++) {
    if (!vis[i]) mem.push_back(i);
    vis[i] = 0;
  }
  for (int i = l; i <= r; i++) {
    if (!a[i])
      st.push_back(i);
    else if (!vis[a[i]])
      vis[a[i]] = 1, st.push_back(i);
    else {
      deque<int> tmp;
      while (!st.empty() && a[st.back()] != a[i])
        tmp.push_front(st.back()), st.pop_back();
      if (st.empty()) No();
      solve(tmp, a[i]);
    }
  }
}
int cnt[N];
int main() {
  n = gi();
  for (int i = 1; i <= 2 * n - 1; i++) a[i] = gi();
  if (n == 1) return printf("yes\n1\n"), 0;
  if (a[1] || a[2 * n - 1]) {
    if (a[1] && a[2 * n - 1] && a[1] != a[2 * n - 1]) No();
    if (!a[1]) a[1] = a[2 * n - 1];
    if (!a[2 * n - 1]) a[2 * n - 1] = a[1];
    solve(1, 2 * n - 1);
    Yes();
  } else {
    solve(2, 2 * n - 2);
    if (!mem.empty()) {
      a[1] = a[2 * n - 1] = mem.back();
      mem.pop_back();
      solve(st, a[1]);
      Yes();
    } else {
      for (int i = 0; i < st.size(); i++)
        cnt[i] = (i ? cnt[i - 1] : 0) + (a[st[i]] > 0);
      for (int i = 1; i < st.size(); i += 2) {
        if (a[st[i]] && cnt[i - 1] * 2 <= i + 1 &&
            (cnt[st.size() - 1] - cnt[i]) * 2 <= st.size() - i) {
          a[1] = a[2 * n - 1] = a[st[i]];
          deque<int> tmp;
          for (int j = 0; j < i; j++) tmp.push_back(st[j]);
          solve(tmp, a[1]);
          tmp.clear();
          for (int j = i + 1; j < st.size(); j++) tmp.push_back(st[j]);
          solve(tmp, a[1]);
          Yes();
        }
      }
      No();
    }
  }
  return 0;
}
