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; }