Home Manual Reference Source Repository

src/fundamentals/rbinsertfixup.js



/**
 * @param {node} z the node to fix, z is RED
 */

export default function rbinsertfixup ( T , z ) {


	while ( z.p.c === RED ) {

		// z is RED
		// if the parent of z is BLACK
		// it violates (3)
		// and we need to fix it

		if ( z.p === z.p.p.l ) {

			// if our parent is a left child
			// let y be our uncle

			//
			//              z.p.p -> BLACK since z.p is RED
			//            /       \
			//    RED <- z.p       y
			//         /     \
			//        ? <-z-> ?
			//            |
			//           RED

			let y = z.p.p.r ;

			if ( y.c === RED ) {

				// if our uncle is red

				//
				//              z.p.p -> ~RED (might violate (3))
				//            /       \
				// ~BLACK <- z.p       y -> ~BLACK
				//         /     \
				//        ? <-z-> ?
				//            |
				//           RED

				z.p.c = BLACK ;
				y.c = BLACK ;
				z.p.p.c = RED ;
				z = z.p.p ;

			}


		}

	}

}