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)の*のレベルです。