解释为什么该二叉树的遍历算法有O(NlogN)的时间复杂度?

McFloofenbork:

我要通过破解编码面试书,现在我正在做一个二叉树的锻炼。还有就是根据书的代码片段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);
    }
}
Peter Cheng :

如果我们遇到一个不平衡的节点,我们得到虚假的早日恢复,所以这是最佳的情况。“最坏情况”这个算法来处理是完全平衡的树,因为我们得到虚假的没有早期的回报。对于这个例子的目的,让我们用一个完美的二叉树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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章