1

Add メソッドと Remove メソッドを使用して AVL ツリーを作成しました。ただし、ツリーを視覚的な形式で出力する必要があります。たとえば、バランス ツリーに現在 1、2、3 が含まれている場合、次のようになります。

   3
2
   1

これを行うための比較的簡単な方法はありますか?? (値が追加または削除された後、私のツリーは常に適切にバランスが取れていると想定できます。)

4

1 に答える 1

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

より典型的なツリーの方法でそれが必要な場合は、いくつかの事前計算を行う必要があります (基本的に、ルート ノードをツリーの中央に配置する必要があるため、必要なインデント レベルを計算して作業するために深さを知る必要があります)。行ごとに - 効率が重要でなければ、それほど悪くはないはずです)

于 2011-06-09T20:53:19.883 に答える