#java #data-structures #tree #linked-list
#java #структуры данных #дерево #связанный список
Вопрос:
Я пытаюсь выяснить, как создать метод toString() из класса parentheticRepresentation, приведенного ниже.
public static <E> String parentheticRepresentation(Tree<E> T, Position<E> v) {
String s = v.element().toString();
if (T.islnternal(v)) {
Boolean firstTime = true;
for (Position<E> w : T.children(v))
if (firstTime) {
s = " ( " parentheticRepresentation(T, w);
firstTime = false;
}
else s = ", " parentheticRepresentation(T, w);
s = " ) ";
}
return s;
}
В моем основном классе, когда я создаю узлы для своего дерева и пытаюсь вывести все дерево, он просто выводит один узел с представлением в скобках. Итак, как мне создать другой класс toString(), используя это, чтобы при вызове для вывода моего дерева он давал мне представление, как в классе выше. Любая помощь будет оценена!
public static void main(String[] args) {
LinkedTree<Character> T = new LinkedTree();
// add root
T.addRoot('A');
// add children of root
T.createNode('B', (TreeNode) (T.root()), new NodePositionList());
TreePosition C = T.createNode('C', (TreeNode) (T.root()),
new NodePositionList());
T.createNode('D', (TreeNode) (T.root()), new NodePositionList());
// add children of node C
T.createNode('E', C, new NodePositionList());
TreePosition F = T.createNode('F', C, new NodePositionList());
T.createNode('G', C, new NodePositionList());
// add childrn of Node F
T.createNode('H', F, new NodePositionList());
T.createNode('I', F, new NodePositionList());
// print out tree
System.out.println("Size = " T.size());
System.out.println("Here is the tree:");
System.out.println(T);
}
}
Комментарии:
1. Вы ожидаете чего-то вроде A(B, C (E, F (H, I), G), D)?
2. ДА. я просто не могу понять, что написать в моем методе toString, который возвращает мне этот вывод, используя parentheticRepresentation .
Ответ №1:
Вам нужно будет выполнить предварительный обход, просто открыв скобку при обходе дочерних элементов, а затем закрыв ее после этого.
Что-то вроде этого (не уверен, работает ли это, поскольку я его не тестировал, но просто чтобы дать вам представление).
public static <E> String parentheticRepresentation(Tree<E> T, Position<E> v) {
String s = "";
if (T.islnternal(v)) {
s = v.element().toString(); //adds node to string
if(T.children(v).size() > 0)
{
s = "("; //opens parenthesis for children
for (Position<E> w : T.children(v))
{
s = parentheticRepresentation(T, w) ",";
}
s = s.deleteCharAt(s.length() - 1); //deletes last comma
s = ")"; //closes parenthesis for children
}
}
return s;
}
Чтобы переопределить метод toString(), добавьте что-то вроде этого в класс Tree.
@Override
public String toString(){
//Just speculating the TreeHelper name, but its calling the helper method.
return TreeHelper.parentheticRepresentation(this,this.root());
}
редактировать: используя ссылку «this», поскольку мы находимся внутри класса Tree.
Комментарии:
1. Хорошо, я это понимаю, но как мне создать метод toString(), который возвращает мне это представление в скобках
2. вам нужно будет переопределить метод toString() в классе Tree и вызвать для него этот метод.
3. @Override public String toString() { Tree<E> T = null; Position<E> v = null; возвращает представление в скобках (T, v); }
4. Я пытался это сделать, но при компиляции он выдает ошибки
5. Я также пытался использовать ваше редактирование, но оно выводит только узел «A», то есть корень.
Ответ №2:
Ну, очевидно, что OP находится в моем классе data structures….
Вот что я сделал (с помощью предоставленного нам метода представления в скобках).
private static <E> String parentheticRepresentation (Tree <E> T, Position <E> v){
String s = v.element().toString();
if (T.isInternal(v)){
Boolean firstTime = true;
Iterator <Position<E>> it = T.children(v).iterator();
while (it.hasNext()){
Position<E> w = it.next();
if (firstTime) {
s = " ( " parentheticRepresentation (T,w);
firstTime = false;
}
else s = ", " parentheticRepresentation (T,w);
s = " )";
}}
return s;
}
public String toString()
{
return parentheticRepresentation(this,this.root());
}
Проблема в том, что я продолжаю получать ошибки переполнения стека для своих дочерних методов (которые добавлены ниже)
РЕДАКТИРОВАТЬ: я исправил ошибки переполнения стека, но знаю, что у меня та же проблема, что и у OP. Выводится только корень (A).
public Position<E> parent(Position<E> v) throws InvalidPositionException,
BoundaryViolationException {
TreePosition<E> p = checkPosition(v);
Position<E> parentPosition = p.getParent();
if (parentPosition == null)
throw new BoundaryViolationException("No parent");
return parentPosition;
}
public Iterable<Position<E>> children(Position<E> v)
throws InvalidPositionException {
TreePosition <E> p = checkPosition(v);
if (isExternal(v)) //STACK OVERFLOW
throw new InvalidPositionException("");
return p.getChildren();
}
public boolean isInternal(Position<E> v) throws InvalidPositionException {
checkPosition(v);
return (children(v) != null);
}
public boolean isExternal(Position<E> v) throws InvalidPositionException {
checkPosition(v);
return (children(v) == null); // STACK OVERFLOW
}
Комментарии:
1. ага, получаю то же самое … «А».