2016-03-23 15 views
0

AVLツリー挿入の標準プロセスでは、新しいノードを挿入した後、下から上への調整を行い、処理中にサブツリーの高さを1つ増やすことができますサブツリー(高さを1つ増やした後)は、まだ左/右の子の高さが同じですか?もしそうなら、例が分かるでしょう。もしそうでなければ、なぜ誰かが理由を説明できれば素晴らしいでしょう。ありがとう。 :)ここ AVLツリーの挿入操作について

は、AVLツリーへの参照である( https://en.wikipedia.org/wiki/AVL_tree

に関して、 リンWikipedia Binary Tree pageから

+1

具体的なことができますか? – ferit

+0

@ Saibot、AVLツリーの参照を追加します。バランス(左/右)の子供が同じ高さを維持しながら、ツリーが1だけ増加することは不可能だと思います。しかし、私は間違っている可能性がありますので、アドバイスをしてください。まだ私の質問が明確でない場合は、どの部分がわからないのか教えてください。ありがとう。 :) –

+1

(短い答え:できません。より大きなサブツリーの高さが増え、元の高さのサブツリーが得られた場合は、回転が使用されます。 )_ ...のように、関係するノードとツリーの名前を定義してください。一つのノード_a _ <_ _の両方で、高さの前条件と事後条件を挿入することができます。 – greybeard

答えて

1

サブツリーの左右の子が同じ高さのままになるように挿入後にはできません。

サブツリー内のノードが<の3つの単純な例を考えてみましょう。バランス係数のpossiblitiesは、

  • +1である - 1右の子なし左の子とのサブツリーのルートノードである - ルート1左の子とのサブツリー内のノードと権利子
  • -1これは
  • 0 - サブツリーのルートノードには、右と左に1つのノードがあります。
バランス係数+1とサブツリーの

  • 我々は右に挿入する場合、我々は2に、左にバランス係数の変更を挿入した場合、我々は
  • OKですので、私たちは必要この場合、サブツリーの高さが変更された場合には、ツリーのバランスを取ることができます。サブツリーの

バランス係数-1、

  • と我々は左に挿入した場合、我々は-2に右、バランス係数の変化に挿入する場合、我々は
  • OKです。したがって、ツリーのバランスを取る必要があり、その場合、サブツリーの高さが変更されます。
バランス係数0とサブツリーの

  • 我々は左に挿入した場合、我々はOKです。高さは変更されますが、子ノードも変更されます。
  • 右に挿入するとOKです。高さは変更されますが、子ノードも変更されます。

したがって、高さを変更しても同じ左右の高さを変更することはできません。

+1

(この回答には、問題と同じ問題があります。ツリー内のすべてのノードをサブツリーのルートと見なすことができます。)ノードを特定することなく、変更前または変更後に「サブツリー」を話すサブツリーは完全にあいまいです)。 – greybeard

+1

答えに説明されているサブツリーをツリー全体として扱うことができます。コンセプトは変わりません。高さを変更して挿入することはできず、子ノードの高さをそのまま維持できます。あなたが違うなら、ルートノードの高さを変更でき、左右の子供の高さをそのまま維持できることを証明できる例を挙げてください。 –

+0

@AshraffAliWahab、素敵な答え、投票アップ。あなたの正確な定義は何ですか?左と右の子供の同じ高さを意味しますか?または、元のバランス係数(-1、0または+1)を維持することを意味しますか? –

4

平衡二分木は、最小の可能な最大の高さ(別名 を有します葉ノードについては、任意の与えられた数の葉ノードについて、 が可能な最大の高さに配置されるため、

一つの一般的なバランスのとれたツリー構造は、各ノードの左及び右サブツリーは例えばもはや

1より

によって高さが異なる た二分木構造である:

これはバランスの取れた木。

enter image description here

そして、我々は1を挿入した場合には、1だけ高さが高くなるのですけれども、それは再び均衡ツリーです。左と右のサブツリーはせいぜい1

ところでenter image description here

高さが異なるため、AVLツリーは、自己均衡二分探索木ではありません。挿入後にバランスを失うことはできません。なぜなら、挿入するたびに、ツリーは必要な回転を行うことでバランスをとるからです。

という用語を使用すると、という用語が間違っていると思います。高さの差がないようにバランスがとれていると考えていますが、高さの差は1以下です。

質問:AVL木挿入の標準的なプロセスで

、それが(なぜなら挿入及び回転動作の)一つのサブツリーの高さの増加は、サブツリーしばらく(高さの後に、可能です1つ増える)、左右の子供の高さは同じですか?

我々は左と右の枝から同じ高さを持っており、我々は左の枝の葉ノードにノードを挿入する場合は、ツリーの高さはmaximum(height(left_branch, right_branch))あるので、高さは、増加するツリーを持つことになります。この操作の後、height(left_branch)height(right_branch)+1に等しいためです。だから、彼らは平等ではありません。要するに

、あなたの前提条件はheight(left_branch) == height(right_branch)

あなたの操作はそうheight(left_branch) == height(right_branch)条件がもはや真であることはできませんincreasing height of left_branch by 1

です。

+1

感謝Saibot、投票アップ。はい、私がバランスを言うとき、私はそれが左右のサブツリーの同じ高さを持つことが可能かどうかを意味します。実際に私の質問は、AVLツリー挿入の標準的なプロセスでは、サブツリーの高さを1つ増やしても、サブツリーの高さを1つ増やすことは可能ですか?あなたのアドバイスは高く評価されています。私は元の質問も修正します。 :) –

+1

@LinMaこの説明があなたのために十分でない場合は、その場合私は例を提供することができます私に教えてください。 – ferit

+0

詳細についてはSaibotに感謝して投票してください。 :)あなたのコメントのために、「もし私たちが左右の枝から同じ高さの木を持っていれば、私はそこに前提の問題があると思う。ノードを挿入する前に、ツリーは、バランスのほかに、子が右の子よりも上位に残るか、またはその逆になる可能性があります。だから、私はこの仮定に基づくあなたの分析が100%正しいとは思えません。私は間違っている可能性があり、私を修正するために自由に感じてください。 –

関連する問題