Как мне ссылаться на метод для добавления в двоичное дерево?

#java #binary-tree

#java #двоичное дерево

Вопрос:

Мне поручено создать двоичное дерево, представляющее код Морзе. Он ответвляется влево с каждой точкой и вправо с каждой черточкой.

Однако я не могу понять, почему мой метод добавления узла, похоже, не хочет работать с объектом BinaryTree. IntelliJ говорит, что он «не может разрешить метод».

Я уверен, что проблема не в двоичном дереве, потому что мой инструктор дал мне подробные инструкции о том, как написать класс. Скорее, я подозреваю, что, возможно, я ссылаюсь здесь не на то. Я уже проверил, что введенные параметры не являются проблемой.

  public static MorseCodeTree<Character> readMorseCodeTree()
 {
    MorseCodeTree<Character> morse = new MorseCodeTree<Character>();
    Node<Character> newNode = new Node<Character>(null);
    morse.addNode(newNode, letter, position);

    private Node<Character> addNode(Node<Character> currentNode, char data, String morseCode)
    {
    if (currentNode == null)
    {
        currentNode = new Node(null);
    }

    if (morseCode.charAt(0) == '*')
    {
        currentNode = addNode(currentNode.left, data, morseCode.substring(1));
    }
    else if (morseCode.charAt(0) == '-')
    {
        currentNode = addNode(currentNode.right, data, morseCode.substring(1));
    }
    else
    {
        currentNode.data = data;
    }
    return currentNode;
}
  

Класс BinaryTree:

импортируйте java.io.Serializable; импортируйте java.util.Сканер;

открытый класс BinaryTree реализует Serializable{

 //implement Node class
protected static class Node<E> implements Serializable
{
    protected E data;
    protected Node<E> left;
    protected Node<E> right;

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

    public String toString()
    {
        return data.toString();
    }
}
  

защищенный корень узла;

 public BinaryTree()
{
    root = null;
}

protected BinaryTree(Node<E> root)
{
    this.root = root;
}

public BinaryTree(E data, BinaryTree<E> leftTree, BinaryTree<E> rightTree)
{
    root = new Node<E>(data);
    if (leftTree != null)
    {
        root.left = leftTree.root;
    }
    else
    {
        root.left = null;
    }
    if (rightTree != null)
    {
        root.right = rightTree.root;
    }
    else
    {
        root.right = null;
    }
}

public BinaryTree<E> getLeftSubtree()
{
    if (root != null amp;amp; root.left != null)
    {
        return new BinaryTree<E>(root.left);
    }
    else
    {
        return null;
    }
}

public BinaryTree<E> getRightSubtree()
{
    if (root != null amp;amp; root.right != null)
    {
        return new BinaryTree<E>(root.right);
    }
    else
    {
        return null;
    }
}

public boolean isLeaf()
{
    return (root.left == null amp;amp; root.right == null);
}

public String toString()
{
    StringBuilder sb = new StringBuilder();
    preOrderTraverse(root, 1, sb);
    return sb.toString();
}

private void preOrderTraverse(Node<E> node, int depth, StringBuilder sb)
{
    for (int i = 1; i < depth; i  )
    {
        sb.append(" ");
    }
    if (node == null)
    {
        sb.append("nulln");
    }
    else
    {
        sb.append(node.toString()   "n");
        preOrderTraverse(node.left, depth   1, sb);
        preOrderTraverse(node.right, depth   1, sb);
    }
}

public static BinaryTree<String> readBinaryTree(Scanner scan)
{
    String data = scan.next();
    if (data.equals("null"))
    {
        return null;
    }
    else
    {
        BinaryTree<String> leftTree = readBinaryTree(scan);
        BinaryTree<String> rightTree = readBinaryTree(scan);
        return new BinaryTree<String>(data, leftTree, rightTree);
    }
}
  

}

Комментарии:

1. Вам будет легче помочь, если вы укажете точную ошибку, которую выдает компилятор.

2. Отредактировано для добавления, но моя среда разработки сообщает мне «не удается разрешить метод».

3. Можете ли вы добавить свой класс BinaryTree and Node ? Я заметил несколько вещей, но мне нужны эти классы, чтобы копать глубоко и быть уверенным. Спасибо

Ответ №1:

Вы объявляете addNode(...) метод внутри readMorseCodeTree() , поэтому он не входит в область видимости класса. Последний метод должен выглядеть следующим образом:

  public static BinaryTree<Character> readMorseCodeTree()
 {
    BinaryTree morse = new MorseCodeTree();
    Node<Character> newNode = new Node<Character>(null);
    morse.addNode(newNode, letter, position);
 }
  

Комментарии:

1. Это хорошая уловка, но, к сожалению, это не решило проблему.

2. @BrineK addNode(...) объявляется в BinaryTree классе?

3. Нет? Я предоставил класс BinaryTree выше. MorseCodeTree является дочерним элементом BinaryTree.

4. @BrineK Вы объявляете morse как BinaryTree объект, поэтому addNode(...) необходимо объявить / реализовать в BinaryTree (возможно, просто абстрактно), или вы можете просто изменить объявление на: MorseCodeTree morse = new MorseCodeTree(); .

5. Еще одна вещь: я получаю ошибку несовместимых типов для: currentNode.data = данные. (currentNode.data — это символ, данные — символ) Не следует ли автоматически переносить char?