【发布时间】:2013-03-04 01:48:04
【问题描述】:
我需要用 O(1) 的时间来微调二叉搜索树的高度,我能想到的唯一方法是检查添加和删除方法,增加全局计数器是否有其他方法怎么办?
【问题讨论】:
-
您需要多精确?如果它是平衡的,它应该是 log n。 log n 可以近似为值 n 中的有效位数。
我需要用 O(1) 的时间来微调二叉搜索树的高度,我能想到的唯一方法是检查添加和删除方法,增加全局计数器是否有其他方法怎么办?
【问题讨论】:
O(1) 时间表明您应该已经拥有请求时的高度。
最好的方法是在添加/删除新节点时保持/更新正确的值。你这样做是对的,但是它增加了添加和删除的复杂性。
您可以通过多种方式做到这一点,例如将深度值与树中的节点一起保持等。
class Node{
int depth;
Object value;
}
Node lowestNode;
我可以考虑将最大深度节点引用存储在一个对象中并将其保存为 depth 。因此,无论何时添加新元素,都可以根据其父元素检查元素的深度,如果新元素具有更大的深度,则替换最大深度节点。
如果您要删除最大深度节点,则将其替换为父节点,否则沿树递归地更正所有元素的深度。
树的高度是lowestNode.depth
【讨论】:
为高度存储一个属性并在添加/删除时更新它应该是最合理的解决方案。
如果保证树是平衡的(例如 AVL),你可以通过树中元素的数量来计算高度(你必须保持元素的数量:P)
【讨论】: