code: @SuppressWarnings("unchecked")
      private Zipper<K, V> unzipBoth(Tree<K, V> left, Tree<K, V> right, List<Tree<K, V>> leftZipper, List<Tree<K, V>> rightZipper, int smallerDepth) {
          if (isBlackTree(left) && isBlackTree(right)) {
              return unzipBoth(left.getRight(), right.getLeft(), cons(left, leftZipper), cons(right, rightZipper), smallerDepth + 1);
          } else if (isRedTree(left) && isRedTree(right)) {
              return unzipBoth(left.getRight(), right.getLeft(), cons(left, leftZipper), cons(right, rightZipper), smallerDepth);
          } else if (isRedTree(right)) {
              return unzipBoth(left, right.getLeft(), leftZipper, cons(right, rightZipper), smallerDepth);
          } else if (isRedTree(left)) {
              return unzipBoth(left.getRight(), right, cons(left, leftZipper), rightZipper, smallerDepth);
          } else if ((left == null) && (right == null)) {
              return new Zipper<K, V>((List<Tree<K, V>>) Collections.EMPTY_LIST, true, false, smallerDepth);
          } else if ((left == null) && isBlackTree(right)) {
              return new Zipper<K, V>(unzip(cons(right, rightZipper), true), false, true, smallerDepth);
          } else if (isBlackTree(left) && (right == null)) {
              return new Zipper<K, V>(unzip(cons(left, leftZipper), false), false, false, smallerDepth);
          } else {
              throw new RuntimeException("unmatched trees in unzip: " + left + ", " + right);
          }
      }
docs: found to be deeper, or the bottom is reached