簡體   English   中英

如何在漂亮的圖中打印二叉搜索樹?

[英]How to print binary search tree in nice diagram?

我必須使用打印帶有如下連接的漂亮圖表的方法來實現二叉搜索樹:

在此處輸入圖像描述

現在我設法打印了這個:

在此處輸入圖像描述

但是我正在努力讓它變得更好:/

你有任何提示如何解決這個問題嗎?

這是我實現它的實例代碼:

public interface PrintableTree {

    class Node {
        int data;
        Node left, right;

        Node(int data) {
            this.data = data;
            this.left = null;
            this.right = null;
        }
    }

    class Trunk {
        Trunk prev;
        String str;

        Trunk(Trunk prev, String str) {
            this.prev = prev;
            this.str = str;
        }
    }

    Node insert_Recursive(Node root, int key);

    void add(int i);

    String prettyPrint();

    static PrintableTree getInstance() {
        return new PrintableTree() {
            String stringOfTree = "";
            static final int COUNT = 2;
            Node root;

            @Override
            public void add(int i) {
                root = insert_Recursive(root, i);
            }

            @Override
            public Node insert_Recursive(Node root, int key) {
                if (root == null) {
                    root = new Node(key);
                    return root;
                }

                if (key < root.data)
                    root.left = insert_Recursive(root.left, key);
                else if (key > root.data)
                    root.right = insert_Recursive(root.right, key);

                return root;
            }

            @Override
            public String prettyPrint() {
                printTree(root, null, false);
                return "";
            }

            public void showTrunks(Trunk p) {
                if (p == null) {
                    return;
                }

                showTrunks(p.prev);
                System.out.print(p.str);
            }

            public void printTree(Node root, Trunk prev, boolean isLeft) {
                if (root == null) {
                    return;
                }

                String prev_str = "    ";
                Trunk trunk = new Trunk(prev, prev_str);

                printTree(root.left, trunk, true);

                if (prev == null) {
                    trunk.str = "";
                } else if (isLeft) {
                    trunk.str = "┌";
                    prev_str = "    │";
                } else {
                    trunk.str = "└";
                    prev.str = prev_str;
                }

                showTrunks(trunk);
                System.out.println(" " + root.data);

                if (prev != null) {
                    prev.str = prev_str;
                }
                trunk.str = "   │";

                printTree(root.right, trunk, false);
            }

        };
    }
}

您可以使用這些功能。 它們返回一個字符串,因此由調用者來打印它。

當右子樹向上打印而左子樹向下打印時,我也發現它更好。 這樣一來,樹就與通常描繪的方式旋轉了 90° - 根在頂部。

以下是相關代碼:

    public String pretty() {
        return pretty(root, "", 1);
    }

    private String pretty(Node root, String prefix, int dir) {
        if (root == null) {
            return "";
        }

        String space = " ".repeat(("" + root.data).length());
        return pretty(root.right, prefix + "│  ".charAt(dir) + space, 2)
            + prefix + "└ ┌".charAt(dir) + root.data
              + " ┘┐┤".charAt((root.left  != null ? 2 : 0) 
                            + (root.right != null ? 1 : 0)) + "\n"
            + pretty(root.left, prefix + "  │".charAt(dir) + space, 0);
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM