Итак, я получил этот вопрос в интервью по телефону в Google, они хотят, чтобы я написал метод, который печатает внешние элементы дерева по часовой стрелке.Пример:
1
/ | \
4 5 7
/ / /\
9 12 3 24
\
14
^ |
| v
|-<--|
prints 1, 7, 24, 3, 12, 14, 9, 4
notice that 5 isnt printed because its not "out"
, поэтому я придумал следующее:
TreeNode {
int val;
List<TreeNode> children;
}
void printTreeClockWise(TreeNode root) {
if (root == null) return;
System.out.println(root.val);
printRight(root); // recursively prints the outer right nodes
printLeafs(root); // recursively prints roots with .children.size() > 0
printLeft(root); //recursively prints the left outer nodes
}
Затем я реализовал эти вспомогательные функции, и он сказал, что это хорошо.Мои методы в основном возвращаются к самому левому / правому / нижнему узлу (к каждой из стен), а затем печатаются.Он сказал, что мои методы хороши, и они работают, но что, если теперь дерево огромно (не может поместиться в памяти), и они приходят с серверов по мере нашего продвижения, поэтому я не могу "надежно" дождаться загрузки всего дерева и затем распечатать его,Как мне обновить мой код?Я сказал, что могу добавить логическое значение и подождать, пока оно не станет истинным, а затем попытаться решить, является ли этот узел пригодным для печати, например,
TreeNode {
int val;
List<TreeNode> Children;
boolean noMoreChildrenUnder;
}
Затем он сказал, что намек на добавление указателя на родительский элемент.
TreeNode parent;
Тогда я понятия не имел, чем может помочь мне родительский указатель.Любые идеи для использования родительского указателя для достижения этой печати, при этом не нужно читать во всем дереве?Или любая оптимизация, которую я могу использовать здесь?Спасибо!