Печать дерева AVL в JTextPane: Java

Я создал дерево AVL с работающими методами добавления и удаления. Однако мне нужно распечатать дерево в визуальном формате. Например, если сбалансированное дерево в настоящее время содержит 1, 2, 3, оно будет выглядеть примерно так:

   3
2
   1

Есть ли относительно простой способ сделать это ?? (Вы можете предположить, что мое дерево всегда будет правильно сбалансировано после добавления или удаления значения.)


person Chris V.    schedule 09.06.2011    source источник


Ответы (1)


Для того, что вы хотите, есть простой алгоритм, который будет работать неплохо в зависимости от ваших требований. В общем (т.е. рисование узлов) эту проблему довольно сложно решить - и, если я не ошибаюсь, 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