@ 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 ) ; } }
found to be deeper or the bottom is reached