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

Поэтому я пытаюсь распечатать значение в виде длинной строки, которую все мои узлы имеют в BST, проблема в том, что я не могу найти способ сохранить эти значения в методе, поскольку они являются рекурсивными методами (inOrder preOrder postOrder), как мне это сделать? мои коды работают, когда я пытаюсь распечатать каждое значение построчно. Заранее спасибо!

скажем, у меня есть эти имена, и я хочу распечатать их в алфавитном порядке, используя BST: Джерри, Элейн, Ральф, Алиса, Джордж, Сьюзен, Нортон, Трикси. Результат, который я хочу: [Alice] [Элейн] [Джордж] [Джерри] [Нортон] [Ральф] [Susan] [Трикси]

import java.util.Random;

public class TreeNode {

    private String value;
    private TreeNode left;
    private TreeNode right;

    public TreeNode(String n) {
        value = n;
        left = right = null;
    }

    public void insert(String n) {
        if (n.compareTo(value) <= 0) {
            if (left == null) {
                left = new TreeNode(n);
            } else {
                left.insert(n);
            }
        } else {
            if (right == null) {
                right = new TreeNode(n);
            } else {
                right.insert(n);
            }
        }
    }

    public boolean contains(String n) {
        if (n == value) {
            return true;
        } else if (n.compareTo(value) <= 0) {
            if (left == null) {
                return false;
            } else {
                return left.contains(n);
            }
        } else {
            if (right == null) {
                return false;
            } else {
                return right.contains(n);
            }
        }
    }

    public TreeNode remove(String n) {
        if (n.compareTo(value) < 0) {
            if (left != null) {
                left = left.remove(n);
            }
        } else if (n.compareTo(value) > 0) {
            if (right != null) {
                right = right.remove(n);
            }
        } else {
            if (left == null && right == null) {
                return null;
            } else if (left != null && right == null) {
                return left;
            } else if (left == null && right != null) {
                return right;
            } else {
                Random r = new Random();
                if (r.nextBoolean()) {
                    value = left.rightMost();
                    left = left.remove(value);
                } else {
                    value = right.leftMost();
                    right = right.remove(value);
                }
            }
        }
        return this;
    }

    public String leftMost() {
        if (left == null) {
            return value;
        } else {
            return left.leftMost();
        }
    }

    public String rightMost() {
        if (right == null) {
            return value;
        } else {
            return right.rightMost();
        }
    }

    public String inOrder() {

        String temp = null;
        if (left != null) {
            left.inOrder();
        }

        temp = "["+value+"]";

        if (right != null) {
            right.inOrder();
        }

        return temp;

    }
public class BinarySearchTree {

    private TreeNode root;

    public BinarySearchTree() {
        root = null;
    }

    public void insert(String n) {
        if (root == null) {
            root = new TreeNode(n);
        } else {
            root.insert(n);
        }
    }

    public boolean contains(String n) {
        if (root == null) {
            return false;
        } else {
            return root.contains(n);
        }
    }

    public void remove(String n) {
        if (root != null) {
            root = root.remove(n);
        }
    }

    public String inOrder() {

        if (root != null) {
            root.inOrder();
        }
        return root.inOrder();
    }

Ответы [ 3 ]

0 голосов
/ 02 ноября 2018

В классе TreeNode может быть статическая переменная String. Поскольку существует одна копия переменной, доступная для всех экземпляров, вы можете добавить значение при прохождении.

Например: myPath += "["+value+"]"; где ваш temp = "["+value+"]"; равен

После завершения обхода вы можете напечатать TreeNode.myPath.

0 голосов
/ 02 ноября 2018

Просто объедините результаты вызова inOrder левого и правого поддерева.

public String inOrder() {
    String temp = "[" + value +"]";
    if (left != null) {
        temp = left.inOrder() + temp;
    }

    if (right != null) {
        temp = temp + right.inOrder();
    }
    return temp;
}
0 голосов
/ 02 ноября 2018

Вы можете использовать универсальный тип . Что-то вроде BinarySearchTree<T>, где T может быть объектом любого типа. Затем, когда вы используете его, вы можете инициализировать как BinarySearchTree<String> на случай, если вам нужно иметь дело с String

...