void AssertTreeProperties <T>(RBTree <T> tree) where T : IComparable { if (tree.root is RBLeaf <T> ) { return; } RBBranch <T> branch = (RBBranch <T>)tree.root; AssertValuesLessThan(branch.left, branch.value); AssertValuesGreaterThan(branch.right, branch.value); }
void AssertRedNodesHaveBlackChildren <T>(RBNode <T> node) where T : IComparable { if (node is RBLeaf <T> ) { return; } RBBranch <T> branch = (RBBranch <T>)node; Assert.True(!branch.red || (!branch.left.red && !branch.right.red)); AssertRedNodesHaveBlackChildren(branch.left); AssertRedNodesHaveBlackChildren(branch.right); }
void AssertValuesGreaterThan <T>(RBNode <T> node, T min) where T : IComparable { if (node is RBLeaf <T> ) { return; } RBBranch <T> branch = (RBBranch <T>)node; Assert.Greater(branch.value, min); AssertValuesInRange(branch.left, min, branch.value); AssertValuesGreaterThan(branch.right, branch.value); }
void AssertValuesLessThan <T>(RBNode <T> node, T max) where T : IComparable { if (node is RBLeaf <T> ) { return; } RBBranch <T> branch = (RBBranch <T>)node; Assert.Less(branch.value, max); AssertValuesLessThan(branch.left, branch.value); AssertValuesInRange(branch.right, branch.value, max); }
void AssertAllLeavesBlack <T>(RBNode <T> node) where T : IComparable { if (node is RBBranch <T> ) { RBBranch <T> branch = (RBBranch <T>)node; AssertAllLeavesBlack(branch.left); AssertAllLeavesBlack(branch.right); } else { Assert.False(node.red); } }
int EveryDescendantPathHasTheSameNumberOfBlackNodes <T>(RBNode <T> node) where T : IComparable { if (node is RBLeaf <T> ) { return(1); } RBBranch <T> branch = (RBBranch <T>)node; int leftBlacks = EveryDescendantPathHasTheSameNumberOfBlackNodes <T> (branch.left); int rightBlacks = EveryDescendantPathHasTheSameNumberOfBlackNodes <T> (branch.right); Assert.AreEqual(leftBlacks, rightBlacks); if (branch.red) { return(leftBlacks); } return(leftBlacks + 1); }
public BeachSection BeachSectionContainingPoint(Point point) { RBBranch <BeachSection> candidate = (RBBranch <BeachSection>)beachSections.root; while (true) { int compareResult = candidate.value.CompareTo(point); if (compareResult == 0) { return(candidate.value); } if (compareResult > 0) { candidate = (RBBranch <BeachSection>)candidate.left; } if (compareResult < 0) { candidate = (RBBranch <BeachSection>)candidate.right; } } }