二分木の平均高さはどれくらいですか?


10

二分木の平均高さについて正式な定義はありますか?

次の2つの方法を使用してバイナリツリーの平均の高さを見つけることに関するチュートリアルの質問があります。

  1. 自然な解決策は、ルートからリーフへのすべての可能なパスの平均の長さを取ることです。

    avh1(T)=1# leaves in Tv leaf of Tdepth(v)

  2. 別のオプションは、再帰的に定義することです。つまり、ノードの平均の高さは、サブツリーの平均の高さの平均に1を加えたものです。つまり、

    avh2(N(l,r))=avh2(l)+avh2(r)2+1

    リーフのためのL及びAVH 2_ = 0空きスロット用。avh2(l)=1lavh2(_)=0

私の現在の理解に基づいて、たとえば木の平均高さT

    1    
   / \
  2   3
 /
4

ある再帰を使用している第二の方法で。avh2(T)=1.25

しかし、私はまだ最初の1つを行う方法を完全に理解していません。は正しくありません。avh1(T)=(1+2)/2=1.5


1
いくつかのコンテキストを提供できますか?「正しい」数学的定義などはありません。「二分木の平均高さ」は好きなように定義できます。(の平均以上何分布?)しかし、異なる定義がされます、多かれ少なかれ便利異なるアプリケーションのために。
JeffE 2012

@JeffE "バイナリツリーの平均高さを定義する方法はすぐにはわかりません。おそらく最も自然な解決策は、ルートからリーフまでの可能なパスの平均長を持っていることでしょう。より単純な(おそらく単純化した)ソリューションつまり、ノードの平均の高さは、サブツリーの平均の高さの平均に1を加えたものです。この選択肢をコーディングする方が簡単だとわかります。違いを示す例を挙げられますか?」
タイムレス

2つのバリアントの正確な定義を提供することで、投稿をより明確にすることを試みました。私があなたのテキストを正しく解釈したことを確認してください。特に、2番目のバリアントのアンカーがありませんでした。葉の高さを1にするか0にするかによって違いが生じます。
ラファエル

回答:


3

両方の定義が同じ尺度を説明していると信じる理由はありません。あなたは再帰的に書くこともできます:avh1

avh1(N(l,r))=lv(l)(avh1(l)+1)+lv(r)(avh1(r)+1)lv(l)+lv(r)

avh1(l)=0lavh1

avh1avh2avh2avh1avh1lv(l)=lv(r)これはすぐにわかります。ただし、不均衡な木の場合は異なります。

あなたの計算は確かに正しい(あなたの定義を与えられた)。サンプルツリーは葉のバランスが取れていないことに注意してください。


avh1

avh1

私は再帰を使用した実装コードを意味します
Timeless

@null:ベースケースを組み込むことで、ほぼ文字通りに数式をコピーできます。その方法は、プログラミング言語とツリーの実装によって異なります。実装がハードルである場合は、スタックオーバーフローに繰り返し取り組むことをお勧めします。
ラファエル

2

編集:ジェフは上記のコメントで良い指摘をしています。次の回答の「正しいvs正しくない」を「便利/一貫性vs一貫性のない」と読む必要があります。

2番目の計算が正しくないようです。単一のノード(つまり、葉)を持つサブツリーの高さを0とします。次に、サブツリールートの高さを次のようにします。

  • 4の高さは0
  • 3の高さは0
  • 2の高さは3 + 1 = 0 + 1 = 1の平均の高さ
  • 1の高さは2と3の高さの平均=(0 + 1)/ 2 + 1 = 1.5

最初の計算は正しく行っていると思います。1.5が正解です。


アイデアは、2番目のアプローチに基づく、高さが-1のnullノードです。ノードの平均高さは、サブツリーの平均に1を加えたもので、ノード4の平均高さは((-1)+(-1))/ 2 + 1 = 0です。 、ノード2の平均の高さは(0 +(-1))/ 2 + 1 = 0.5なので、ルートの平均の高さは1.25です。
タイムレス

@null主張すれば、そのように定義できますが、2つの定義は一致しません。
Joe
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.