Для того, что вы хотите, есть простой алгоритм, который будет работать неплохо в зависимости от ваших требований. В общем (т.е. рисование узлов) эту проблему довольно сложно решить - и, если я не ошибаюсь, NP трудно решить в 3d (но для этого тоже есть хорошие генетические алгоритмы).
В любом случае, я использовал что-то подобное quick n 'грязно для целей отладки, но я думаю, что это должно хотя бы дать вам представление о том, как это может работать (код С#, но тогда различия здесь сводятся к разным заглавным буквам):
// Start Method
static internal string PrintTree(Node root) {
StringBuilder sb = new StringBuilder();
PrintTree(root, "", sb);
return sb.ToString();
}
static private void PrintTree(Node node, string indent, StringBuilder sb) {
sb.AppendLine(node.ToString());
if (node.LeftChild != null) {
if (node.RightChild == null) {
PrintLastChild(node.LeftChild, indent, sb);
}
else {
PrintNormalChild(node.LeftChild, indent, sb);
PrintLastChild(node.RightChild, indent, sb);
}
}
}
static private void PrintNormalChild(Node node, string indent, StringBuilder sb) {
sb.Append(indent);
sb.Append('├');
sb.Append('─');
PrintTree(node, indent + "│ ", sb);
}
static private void PrintLastChild(Node node, string indent, StringBuilder sb) {
sb.Append(indent);
sb.Append('└');
sb.Append('─');
PrintTree(node, indent + " ", sb);
}
Если вы хотите, чтобы это было в более типичном виде дерева, вам придется выполнить некоторые предварительные вычисления (в основном, поскольку вы хотите, чтобы корневой узел находился в середине дерева, вам нужно знать глубину, чтобы вычислить необходимый уровень отступа и работать строка за строкой - не должно быть так уж плохо, если эффективность не важна)
person
Voo
schedule
09.06.2011