バランスの取れたツリーの定義を誰かが明確にしてくれるのではないかと思っています。 「各サブツリーのバランスが取れていて、2つのサブツリーの高さが最大で1つ異なる場合、ツリーのバランスが取れています。
これが愚かな質問である場合、私は謝罪しますが、この定義はすべてのノードにツリーの葉まで、またはルートのすぐ左と右のサブツリーのみに適用されますか?これをフレーム化する別の方法は、ツリーの内部ノードのバランスが崩れ、ツリー全体がバランスを保たれる可能性があると思いますか?
通常、制約はすべてのサブツリーに再帰的に適用されます。つまり、ツリーは次の場合にのみバランスが取られます。
これによれば、次のツリーはバランスが取れています。
A
/ \
B C
/ / \
D E F
/
G
次のものは、Cのサブツリーの高さが2異なるため、notバランスが取れています。
A
/ \
B C <-- difference = 2
/ /
D E
/
G
ただし、最初のポイントの特定の制約は、ツリーのタイプによって異なります。上記のリストは、 AVLツリー の典型的なものです。
赤黒木 たとえば、より柔軟な制約を課します。
「バランス」を定義する方法はいくつかあります。主な目標は、すべてのノードの深さをO(log(n))
に保つことです。
あなたが話していたバランス条件は、AVLツリーの場合のようです。
ここにAVLツリーのバランス条件の正式な定義があります。
AVLのノードの場合、左のサブツリーの高さはせいぜい 1だけ右のサブツリーの高さと異なります。
次の質問、「height?」
バイナリツリー内のノードの「height」は、そのノードからリーフまでの最長パスの長さです。
奇妙だが一般的なケースが1つあります。
空のツリーの高さは
(-1)
に定義されています。
たとえば、ルートの左の子はnull
です。
A (Height = 2)
/ \
(height =-1) B (Height = 1) <-- Unbalanced because 1-(-1)=2 >1
\
C (Height = 0)
さらに2つの例を決定します。
はい、バランスの取れたツリー例:
A (h=3)
/ \
B(h=1) C (h=2)
/ / \
D (h=0) E(h=0) F (h=1)
/
G (h=0)
いいえ、バランスの取れたツリーではありません例:
A (h=3)
/ \
B(h=0) C (h=2) <-- Unbalanced: 2-0 =2 > 1
/ \
E(h=1) F (h=0)
/ \
H (h=0) G (h=0)
これら2つのことの間に違いはありません。考えてみてください。
「正の数はゼロであっても、その数から2を引いたものが偶数であっても」という簡単な定義を見てみましょう。これは、6が偶数の場合でも8は偶数であると言いますか?または、6、4、2、および0が偶数の場合でも8は偶数と言いますか?
違いはありません。 6が偶数であっても8が偶数であると言う場合、4が偶数であっても6が偶数であることも示します。したがって、2が偶数の場合でも4は偶数であるということです。したがって、0が偶数の場合でも2は偶数であることがわかります。したがって、6が偶数であっても8が偶数である場合、(間接的に)6、4、2、および0が偶数である場合は8が偶数であることを示します。
ここでも同じです。間接サブツリーは、直接サブツリーのチェーンで見つけることができます。したがって、直接サブツリーに直接適用されるだけでも、すべてのサブツリー(したがってすべてのノード)に間接的に適用されます。
バランスの取れたツリーは、高さがlog(ツリー内の要素の数)のオーダーのツリーです。
height = O(log(n))
O, as in asymptotic notation i.e. height should have same or lower asymptotic
growth rate than log(n)
n: number of elements in the tree
「各サブツリーのツリーはバランスが取れており、2つのサブツリーの高さは最大で1つしか異なりません」という定義の後に、AVLツリーが続きます。
AVLツリーはバランスが取れていますが、バランスツリーのすべてがAVLツリーではないため、バランスツリーはこの定義を保持せず、内部ノードのバランスが取れていない可能性があります。ただし、AVLツリーでは、すべての内部ノードのバランスを取る必要があります。
バランスの取れたツリーの目的は、最小の横断(最小の高さ)で葉に到達することです。ツリーの次数は、ブランチの数から1を引いたものです。バランスの取れたツリーはバイナリではない場合があります。