我要通过破解编码面试书,现在我正在做一个二叉树的锻炼。还有就是根据书的代码片段O(NlogN)
,但是,我不明白这是为什么。我可以理解,如果该算法是O(N)
,但我不知道那里的logN
是从他们的分析中来。
int getHeight(TreeNode root) {
if (root == null) return -1; // Base case
return Math.max(getHeight(root.left), getHeight(root.right)) + 1;
}
boolean isBalanced(TreeNode root) {
if (root == null) return true; // Base case
int heightDiff = getHeight(root.left) - getHeight(root.right);
if (Math.abs(heightDiff) > 1) {
return false;
} else {
// Recurse
return isBalanced(root.left) && isBalanced(root.right);
}
}
如果我们遇到一个不平衡的节点,我们得到虚假的早日恢复,所以这是最佳的情况。“最坏情况”这个算法来处理是完全平衡的树,因为我们得到虚假的没有早期的回报。对于这个例子的目的,让我们用一个完美的二叉树n个节点。
第一呼叫将因此被访问〜n个节点的每个节点上触发的getHeight()。根级总工作为O(n)。
接下来的两个调用(root.left.isBalanced()和root.right.isBalanced())将后续节点上触发的getHeight(),但每一个只要求它在〜1/2 n个节点。1米总高度的工作也为O(n)。
接下来的4个电话会叫的getHeight每个N / 4个节点。因此,对于2总高度的工作也为O(n)。
如果你看到的格局,对于树的每个级别的总工作为O(n),各级所以总工作为O(n)*在一个完美的树,就出来O(nlogn)的水平。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句