【发布时间】:2020-01-23 22:11:46
【问题描述】:
Gayle Laakmann McDowell 对 Coding 采访的提示:
实现一个函数来检查二叉树是否平衡。 对于这个问题,定义了一个平衡树,使得高度 任何节点的两个子树的差异不超过一个。
(下面的示例实现。)
问题:你能帮我理解为什么作者说isBalanced有一个
O(n log n) 的时间复杂度?我在某种程度上可以理解并且可以很好地记住这一点,但我无法像O(n^2)这样的其他时间复杂性那样概念化为什么会出现这种情况。
int getHeight(TreeNode root) {
if (root == null) { return -1; }
return Math.max(getHeight(root.left), getHeight(root.right)) + 1;
}
boolean isBalanced(TreeNode root) {
if (root == null) { return true; }
int heightDiff = getHeight(root.left) - getHeight(root.right);
if (Maths.abs(heightDiff) > 1) {
return false;
} else {
return isBalanced(root.left) && isBalanced(root.right);
}
}
// isBalanced([some node]) --> true/false
我如何想象为什么isBalanced 被视为O(n log n)?
【问题讨论】:
-
递归关系是
T(n) = 2T(n/2) + O(n),这是master theorem的情况2,所以O(n log n)。 -
您的
getHeight函数似乎没有将计算出的高度存储在任何地方。如果您每次都必须为每个节点重做整个操作,我怀疑复杂度会是O(n log(n))。 -
我想你可以在这里找到答案:stackoverflow.com/questions/56193816/…
标签: java time-complexity binary-tree big-o logarithm