将AVL树打印到JTextPane:Java

时间:2011-06-09 20:31:20

标签: java avl-tree

我创建了一个AVL树,使用了Add和Remove方法。但是,我需要以可视格式打印出树。例如,如果平衡树当前包含1,2,3,它将看起来像这样:

   3
2
   1

有一种相对简单的方法吗? (您可以假设在添加或删除值后,我的树将始终正确平衡。)

1 个答案:

答案 0 :(得分:1)

对于你想要的东西,有一个简单的算法根据你的要求不会太糟糕。一般情况下(即绘图节点),这个问题很难解决 - 如果我在3D中没有完全弄错NP(但也有一些很好的遗传算法)。

无论如何,我已经使用类似的快速脏东西进行调试,但我认为至少应该让你知道它是如何工作的(c#代码,但是这里的差异归结为不同的大小写):

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

如果你想以更典型的树形方式进行,你将不得不做一些预计算(基本上因为你想要树根中间的根节点你必须知道深度来计算必要的缩进量线路的水平和工作线 - 如果效率不重要,不应该太糟糕)