#include <bits/stdc++.h>
const int maxn = 505050;
int val[maxn << 1];
int size[maxn];
int l[maxn], r[maxn];
std::stack<int> alloc;
std::vector<std::pair<int, int> > def;
int next[maxn << 1];
inline void build(int llim, int rlim, int fa) {
  std::vector<int> v;
  int ptr = llim;
  while (ptr <= rlim)
    if (!val[ptr]) {
      if (v.size() >= 2 && val[v[v.size() - 1]] && val[v[v.size() - 2]]) {
        v.pop_back();
        val[ptr] = val[v.back()];
        v.pop_back();
      }
      v.push_back(ptr++);
    } else if (ptr == r[val[ptr]]) {
      while (v.size() >= 2 && val[v[v.size() - 1]] && !val[v[v.size() - 2]]) {
        v.pop_back();
        val[v.back()] = val[ptr];
        v.pop_back();
      }
      v.push_back(ptr++);
    } else {
      build(ptr + 1, next[ptr] - 1, val[ptr]);
      ptr = next[ptr];
    }
  std::vector<int> div;
  for (unsigned i = 0; i < v.size(); i++)
    if ((i & 1) || val[v[i]])
      div.push_back(v[i]);
    else {
      if (!div.empty() && val[div.back()]) {
        div.pop_back();
        val[v[i]] = val[div.back()];
      } else if (alloc.empty()) {
        puts("no");
        exit(0);
      } else {
        val[v[i]] = alloc.top();
        alloc.pop();
        div.push_back(v[i]);
      }
    }
  if (!fa) {
    if (alloc.empty()) {
      if (div.size() < 2 || !val[div[1]]) {
        puts("no");
        exit(0);
      }
      for (unsigned i = 3; i < div.size(); i += 2)
        if (div[i] != div[1]) {
          puts("no");
          exit(0);
        }
      val[1] = val[div[1]];
    }
    return;
  }
  if (div.size() > 1 && val[div[1]]) {
    puts("no");
    exit(0);
  }
  for (unsigned i = 1; i < div.size(); i += 2) val[div[i]] = fa;
}
int main() {
  int n;
  scanf("%d", &n);
  int len = (n << 1) - 1;
  for (int i = 1; i <= len; i++) scanf("%d", &val[i]);
  if (val[1] && val[len] && val[1] != val[len]) {
    puts("no");
    return 0;
  }
  val[1] = val[len] = std::max(val[1], val[len]);
  for (int i = 1; i <= len; i++)
    if (val[i]) {
      if (!l[val[i]]) {
        l[val[i]] = i;
        def.push_back(std::make_pair(val[i], i));
      }
      next[r[val[i]]] = i;
      if (((r[val[i]] = i) & 1) != (l[val[i]] & 1)) {
        puts("no");
        return 0;
      }
    }
  std::stack<int> s;
  for (int i = 1; i <= len; i++)
    if (val[i]) {
      if (i == l[val[i]]) s.push(val[i]);
      if (s.top() != val[i]) {
        puts("no");
        return 0;
      }
      if (i == r[val[i]]) {
        s.pop();
        if (!s.empty()) size[s.top()] += size[val[i]];
      }
    }
  for (int i = 1; i <= n; i++)
    if (!l[i])
      alloc.push(i);
    else if (((r[i] - l[i]) >> 1) < size[i]) {
      puts("no");
      return 0;
    }
  build(2, len - 1, val[1]);
  if (!alloc.empty()) {
    for (int i = 1; i <= len; i++)
      if (!val[i]) val[i] = alloc.top();
  } else {
    val[len] = val[1];
    for (int i = 1; i <= len; i++)
      if (!val[i]) {
        puts("no");
        return 0;
      }
  }
  puts("yes");
  for (int i = 1; i <= len; i++) printf("%d ", val[i]);
}
