Algorithm 二叉树直径-算法复杂度

Algorithm 二叉树直径-算法复杂度,algorithm,binary-tree,time-complexity,Algorithm,Binary Tree,Time Complexity,关于寻找一个算法来计算二叉树的直径,下面的代码提供了一个可能的答案 public static int getDiameter(BinaryTreeNode root) { if (root == null) return 0; int rootDiameter = getHeight(root.getLeft()) + getHeight(root.getRight()) + 1; int leftDiameter = getDiame

关于寻找一个算法来计算二叉树的直径,下面的代码提供了一个可能的答案

public static int getDiameter(BinaryTreeNode root) {        
    if (root == null)
        return 0;

    int rootDiameter = getHeight(root.getLeft()) + getHeight(root.getRight()) + 1;
    int leftDiameter = getDiameter(root.getLeft());
    int rightDiameter = getDiameter(root.getRight());

    return Math.max(rootDiameter, Math.max(leftDiameter, rightDiameter));
}

public static int getHeight(BinaryTreeNode root) {
    if (root == null)
        return 0;

    return Math.max(getHeight(root.getLeft()), getHeight(root.getRight())) + 1;
}
在评论部分,上面代码的时间复杂度是O(n^2)。在
getDiameter
函数的给定调用中,将为左右子树调用
getHeight
getDiameter
函数

让我们考虑二叉树的平均情况。高度可在Θ(n)时间计算(最坏情况下也是如此)。那么我们如何计算

getDiameter
函数的时间复杂度呢

我的两个理论

  • t(n)=4T(n/2)+Θ(1)=Θ(n^2),考虑高度计算 (相同?)子问题

  • T(n)=2T(n/2)+n+Θ(1)=Θ(nlogn),n=2*n/2用于高度计算


  • 谢谢你的时间和努力

    有一点让人困惑,那就是你认为二叉树是平衡的。实际上,它可以是一条线。在这种情况下,我们需要从根到叶的
    n
    操作来查找高度,从根的子对象到叶的
    n-1
    操作等等。这将提供
    O(n^2)
    操作来查找所有节点的单独高度

    如果在找到直径之前独立计算每个节点的高度,则可以优化算法。然后我们将花费
    O(n)
    时间来寻找所有高度。那么,寻找直径的复杂性将是以下类型:

    T(n)=T(a)+T(n-1-a)+1


    其中
    a
    是左子树的大小。这种关系也会给求直径提供线性时间。因此,总时间将是线性的。

    关于最坏情况,您是对的,我得到了另一个公式,谢谢!我们也可以在计算直径的同时计算高度,从而得到O(n)。然而,如果我们有一个(几乎)平衡的树,并且我们使用上面的代码,那么什么公式正确地描述了时间复杂度?我的第二个猜测正确吗(为了计算每个节点(n)的高度(logn),我们需要nlogn运算+O(n)运算来计算直径)?第二个猜测我相信πατρριωτακι好,εγχαρριστώ;)我还不会接受这个答案,以防万一有人想帮忙。