このバイナリツリートラバーサルアルゴリズムは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);
    }
}
ピーター・チェン:

我々はアンバランスノードが発生した場合、これは最適なケースですので、我々は偽の早期復帰を取得します。我々は偽のない早期のリターンを得るないのでハンドルに、このアルゴリズムのための「最悪の場合」には、完全にバランスの取れた木です。この例のために、のは、n個のノードを持つ完璧なバイナリツリーを使用してみましょう。

〜n個のノードが訪問されているように、最初の呼び出しは、各ノード上のgetHeight()をトリガします。ルートレベルの合計作業はO(N)です。

次の二つの呼び出し(root.left.isBalanced()とroot.right.isBalanced())は、後続のノード上のgetHeight()をトリガすることになるが、それぞれが唯一〜1/2 n個のノードにそれを呼び出します。1つの高さの合計作業はまた、O(N)です。

次の4つのコールは、n / 4のノードそれぞれに対してのgetHeightを呼び出すことになります。SO 2の高さの合計作業はまた、O(N)です。

あなたがパターンを見る場合は、ツリーの各レベルの合計作業はO(n)があるので、すべてのレベルの合計作業がO(nlogn)に出てくる完璧な木、中にO(n)の*のレベルです。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=196646&siteId=1