private static void FirstWalk(LeafNode currentNode, int currentLevel)
        {
            currentNode.LeftSibling = GetPrevNodeAtLevel( currentLevel );
            SetPrevNodeAtLevel( currentLevel, currentNode );
            currentNode.Modifier = 0;

            if( currentNode.IsLeaf() || (currentLevel == MaxLevelDepth) )
            {
                if( currentNode.HasLeftSibling() )
                {
                    currentNode.PreliminaryLocation = currentNode.GetLeftSibling().PreliminaryLocation 
                        + HorizontalSiblingSeparationFine 
                        + CalcAverageNodeSize( currentNode.GetLeftSibling(), currentNode );
                }
                else
                {
                    currentNode.PreliminaryLocation = 0;
                }
            }
            else
            {
                var rightMostNode = currentNode.GetFirstChild();
                var leftMostNode = rightMostNode;
                FirstWalk( leftMostNode, currentLevel + 1 );

                while ( rightMostNode.HasRightSibling() )
                {
                    rightMostNode = rightMostNode.GetRightSibling();
                    FirstWalk( rightMostNode, currentLevel + 1 );
                }

                var midpoint = (leftMostNode.PreliminaryLocation + rightMostNode.PreliminaryLocation) / 2;

                if( currentNode.HasLeftSibling() )
                {
                    currentNode.PreliminaryLocation = currentNode.GetLeftSibling().PreliminaryLocation 
                        + HorizontalSiblingSeparationFine 
                        + CalcAverageNodeSize( currentNode.GetLeftSibling(), currentNode );

                    currentNode.Modifier = currentNode.PreliminaryLocation - midpoint;
                    Apportion( currentNode, currentLevel );
                }
                else
                {
                    currentNode.PreliminaryLocation = midpoint;
                }
            }
        }
        private static LeafNode GetLeftMost(LeafNode currentNode, int currentLevel, int searchDepth)
        {
            if( currentLevel == searchDepth ) return currentNode; 
            if( currentNode.IsLeaf() ) return null;
            
            var rightMostNode = currentNode.GetFirstChild();
            var leftMost = GetLeftMost( rightMostNode, currentLevel + 1, searchDepth );

            while ( leftMost == null && rightMostNode.HasRightSibling() ) 
            {
                leftMost = GetLeftMost( rightMostNode, currentLevel + 1, searchDepth );
                rightMostNode = rightMostNode.GetRightSibling();
            } 

            return leftMost;
        }