Как распечатать бинарное дерево - PullRequest
0 голосов
/ 28 апреля 2018

Я пытался переключиться на Java с узла, и меня интересует одна вещь: как напечатать объект, такой как двоичное дерево, в формате, аналогичном тому, как его отображал бы узел. Например, мой код инициализации двоичного дерева выглядит следующим образом:

public class BinaryTree {
    int data;
    BinaryTree left, right;

    public static void main(String[] args) {
        BinaryTree tree = new BinaryTree(1);
        tree= new BinaryTree(1);
        tree.left = new BinaryTree(2);
        tree.right= new BinaryTree(3);
        tree.left.right = new BinaryTree(4);
        System.out.println(tree); // output -> BinaryTree@4554617c
    }

    public BinaryTree(int data) {
      super();
      int val;
      this.left = this.right = null;
  }
}

В узле это двоичное дерево будет отображаться следующим образом:

TreeNode {
  val: 1,
  right: TreeNode { val: 3, right: null, left: null },
  left:
   TreeNode {
     val: 2,
     right: TreeNode { val: 4, right: null, left: null },
     left: null } }

Однако на Java, когда я делаю System.out.println (дерево);

вывод -> BinaryTree @ 4554617c

Как правильно распечатать мое BinaryTree и как это сделать? Есть ли способ напечатать дерево в формате JSON?

Ответы [ 2 ]

0 голосов
/ 28 апреля 2018

Я нашел это решение по переполнению стека и изменил его ...

public static class TreeNode
{
    int value;
    TreeNode leftChildren;
    TreeNode rightChildren;

    public TreeNode(int value, TreeNode left, TreeNode right)
    {
        this.value = value;
        this.leftChildren = left;
        this.rightChildren = right;
    }

    public addLeftNode(TreeNode node)
    {
        this.leftChildren = node;
    }

    public addRightNode(TreeNode node)
    {
        this.rightChildren = node;
    }

    public void print(String prefix)
    {
        print(prefix, true);
    }

    private void print(String prefix, boolean isTail)
    {
        System.out.println(prefix + (isTail ? "└── " : "├── ") + this.toString());

        if(null != leftChildren)
        {
            leftChildren.print(prefix + (isTail ? "    " : "│   "), (null == rightChildren ? true : false));
        }

        if(null != rightChildren)
        {
            rightChildren.print(prefix + (isTail ?"    " : "│   "), true);
        }

    }

    @Override public String toString()
    {
        return "TreeNode { Value: " + this.value + "}";
    }
}

Первый узел представляет левый, а второй узел - правый узел в двоичном дереве.

РЕДАКТИРОВАТЬ: Вы можете использовать это так:

TreeNode root = new TreeNode(22, null, null);

root.addLeftNode(new TreeNode(15, null, null));
root.addRightNode(new TreeNode(35, new TreeNode(27, null, null), null));

root.print(); // This will print recursively all sub-nodes

В качестве альтернативы вы можете написать класс-обёртку следующим образом:

public class BinaryTree
{
    private TreeNode root;

    // implementation of getters and setters

    public void print()
    {
        this.root.print();
    }
}
0 голосов
/ 28 апреля 2018

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

...