Поменять значения узлов на их высоты в бинарном дереве
Моя задача состоит в том, чтобы в бинарном дереве поменять значения узлов на их высоты. По условию задания нужно поменять все значения за 1 проход дерева, но можно "выкрутиться", используя дополнительные структуры данных. У меня есть код, но не могу довести его до ума.
public void replaceValuesToHeight() {
replaceValuesToHeight(getRoot(), new Stack<>(), new Stack<>(), 0, 0, 0, true);
}
private int replaceValuesToHeight(TreeNode node, Stack<TreeNode> leftTree, Stack<TreeNode> rightTree, int level, int maxLeft, int maxRight, boolean isLeft) {
if (maxLeft < level ) maxLeft = level;
if (maxRight < level ) maxRight = level;
if (level == 0 && isLeft) {
leftTree.add(getRoot());
}
if (node.getLeft() != null) {
leftTree.add(node.getLeft());
maxLeft = replaceValuesToHeight(node.getLeft(), leftTree, rightTree, level + 1, maxLeft, maxRight, true);
}
if (node.getRight() != null) {
rightTree.add(node.getRight());
maxRight = replaceValuesToHeight(node.getRight(), leftTree, rightTree, level + 1, maxLeft, maxRight, false);
}
if (maxLeft < maxRight) {
while (!leftTree.isEmpty()) {
leftTree.pop().value = maxRight - level;
}
leftTree.add(getRoot());
}
if (maxRight < maxLeft) {
while (!rightTree.isEmpty()) {
rightTree.pop().value = maxLeft - level;
}
rightTree.add(getRoot());
}
node.value = Math.max(maxRight, maxLeft) - level;
return isLeft ? maxLeft : maxRight;
}
Ответы (1 шт):
Автор решения: MBo
→ Ссылка
Чтобы найти все "высоты" за один проход, нужно использовать обход дерева в "обратном" порядке - postorder
int postorder(node)
if (node = null)
return 0
depth = 1 + max(postorder(node.left), postorder(node.right))
node.value = depth
return depth