Java Печать печатного номера BST с круглыми скобками
Я хочу вернуть строку, содержащую все ключи в дереве, в порядке их хранения. Ключи в каждом поддереве должны содержаться в скобках.
_7_
/ \
_3_ 8
/ \
1 6
\ /
2 4
\
5
Выход для этого BST должен быть (((()1(()2()))3((()4(()5()))6()))7(()8()))
, Мой код для этого:
public String printKeysInOrder() {
if (isEmpty()) {
return "()";
}
printInOrderRec(root);
System.out.print(sb.toString());
return sb.toString();
}
StringBuilder sb = new StringBuilder();
private String printInOrderRec(Node root) {
if (root == null) {
return null;
}
sb.append("(");
printInOrderRec(root.left);
sb.append("(");
sb.append(")");
sb.append(root.val);
printInOrderRec(root.right);
return null;
}
Что дает мне вывод: (((()1(()2()3((()4(()5()6()7(()8
, Я работал над этим целую вечность и не могу понять, где и как добавить пропущенные скобки. Любая помощь будет оценена.
1 ответ
Прежде чем перейти к решению проблемы кодирования, давайте попробуем нарисовать, каким образом должен быть получен результат.
(--------------------------------7-------)
(------------3-----------------) (--8--)
(--1-------) (------------6--) () ()
() (--2--) (--4-------) ()
() () () (--5--)
() ()
Здесь каждая пара в скобках определяет стек вызовов. Я не пытаюсь описать каждый стек вызовов, иначе этот ответ будет произвольно длинным. Однако из рисунка мы можем найти 5 порций в каждом стеке вызовов.
- Левый парантез
- Левый ребенок
- Значение
- Правильный ребенок
- Правый парантез
Итак, ваш printInOrderRec
Метод может выглядеть так:
private void printInOrderRec(Node root) {
sb.append("(");
if (root != null) {
printInOrderRec(root.left);
sb.append(root.val);
printInOrderRec(root.right);
}
sb.append(")");
}
Примечание: я сделал тип возврата void
потому что в вашем коде он ничего не возвращает, кроме нуля.