The valid test tree:
|-- 26:B
|   |-- 17:R
|   |   |-- 14:B
|   |   `-- 21:B
|   `-- 41:B
|       `-- 47:R

Validators (Problems 8.3, 8.11 to 8.14)
  PASS: 8.3  valid RB tree is a BST
  PASS: 8.3  empty tree is a BST
  PASS: 8.3  broken BST detected
  PASS: 8.11 four black nodes
  PASS: 8.11 empty tree has none
  PASS: 8.12 no red-red in the valid tree
  PASS: 8.12 red-red violation detected
  PASS: 8.13 uniform black-height
  PASS: 8.14 valid tree is a valid RB tree
  PASS: 8.14 a red root is rejected
  black-height of the root = 2

The int-bounds pitfall, on a single BLACK node holding INT_MIN
  isBST with int bounds          : false
  isBSTRepaired, wider bounds    : true

Problem 8.15: leftRotate on the chain 10 -> 20 -> 30
|-- 10:B
|   `-- 20:R
|       `-- 30:R
  after leftRotate(10):
|-- 20:R
|   |-- 10:B
|   `-- 30:R
  PASS: root is now 20
  PASS: 20's children are 10 and 30
  PASS: 10's parent pointer was fixed

Problem 8.15: rightRotate on the chain 30 <- 20 <- 10
|-- 20:R
|   |-- 10:R
|   `-- 30:B
  PASS: root is now 20
  PASS: 20's children are 10 and 30
  PASS: 30's parent pointer was fixed

Problem 8.15: a non-root rotation, leftRotate(30)
|-- 20:B
|   |-- 10:B
|   `-- 35:B
|       |-- 30:R
|       |   |-- 25:B
|       |   `-- 33:R
|       `-- 40:R
  PASS: root is still 20
  PASS: 20's right is now 35
  PASS: 35's left is 30
  PASS: 30's right is 33

=== 20 passed, 0 failed ===
