【データ構造】二分木アルゴリズムの原理の詳細な説明+コード+インタビューの質問

データ構造とアルゴリズム-二分木

1.二分木の基本概念

1.二分木の概念

バイナリツリー(バイナリツリー)は、n個のノードの有限集合です。このセットは、空のセット(この場合、バイナリツリーは空のツリーと呼ばれます)であるか、ルートノードとルートノードと呼ばれる2つのばらばらのツリーで構成されます。左側のサブツリーと右側のサブツリーは、二分木で構成されています。
1)ルートと呼ばれる特定のノードは1つだけです。
2)n> 1の場合、残りのノードはm(m> 0)の互いに素な有限集合に分割できます。各集合はそれ自体がツリーであり、ルートのサブツリーと呼ばれます。
ここに画像の説明を挿入
他にもいくつかの概念があります:
1。フォローノード:ツリーの最上位ノード
2.ブランチノード:少なくとも1つの子ノードを持つノード
3.次数:ノードが持つサブツリーの数
4.エッジ:1つのノード
5、パス間の接続
すべてのノードの数からルートノードまでのノードとその子孫の間のノードとその子孫を接続するノードとエッジのシーケンス:6、ノードの層の数
深さ7、ノード:ルートからノードからノード
8までのエッジの数ノードの高さ:ノードの高さは、ノードと特定のリーフの間に存在する最長のパス上のエッジの数です。
9.ツリーの高さ:ルートノードの高さ

ここに画像の説明を挿入

2.二分木の性質:

(1)二分木では、i番目の層に最大2 i − 1 2 ^ {i−1}があります。2i 1ノード(i≥1)
(2)深さkの二分木は最大で2 k − 1 2 ^ {k−1}を持ちます2k 1ノード(k≥1)
(3)二分木の場合、葉ノードの数がn0次数2のノードの数がn2の場合、n0= n2+1
(4) N個のノードとの完全なバイナリツリーの深さは⌊logある2n⌋+ 1

ここに画像の説明を挿入

3.二分木の2つのストレージ構造

  1. シーケンシャルストレージ

完全な二分木には、シーケンシャルストレージ構造を使用できます。ただし、一般的な二分木では、ストレージ構造を使用する場合に2つの欠点があります。まず、完全な二分木でない場合は、完全な二分木に変換する必要があります。次に、多くの仮想ノードと無駄が追加されます。リソーススペース。

ここに画像の説明を挿入

  1. チェーン収納

これは、最も一般的に使用されるバイナリツリーストレージ構造です。各ノードは、値ドメイン、左ポインタードメイン、右ポインタードメインの3つのドメインを設定します。データは値ドメインを表し、lchildとrchildはそれぞれ左と右のサブツリーを指すポインタードメインを表します。写真が示すように。

ここに画像の説明を挿入

4.二分木の探索

二分木の操作では、二分木のトラバーサルが基本操作です。二分木のトラバーサル操作では、主に、
プレオーダートラバーサル、ミドルオーダートラバーサル、ポストオーダートラバーサル、およびポストオーダートラバーサルに分けられます。階層的トラバーサル。
実際バイナリツリーのトラバーサルは再帰的プロセス
です。トラバーサルの再帰的式:
preOrder®= print r-> preOrder(r-> left)-> preOrder(r-> right)
中間の再帰的式オーダートラバーサル:
inOrder®= inOrder(r-> left)-> print r-> inOrder(r-> right)
ポストオーダートラバーサルの再帰式:
postOrder®= postOrder(r-> left)-> postOrder(r ->右)->印刷r

1.プレオーダートラバーサル:ルートについて
アイデア:最初にルートにアクセスし、次に左側のサブツリーをトラバースし、次に右側のサブツリーをトラバースします
ABDHIEJCFKG
ここに画像の説明を挿入

2.中次走査:左ルート右
アイデア:最初に左サブツリーをトラバースし、次にルートにアクセスし、最後に右サブツリーをトラバースします
HDIBEJAFKCG
ここに画像の説明を挿入

3.ポストオーダートラバーサル:左ルートと右ルート
アイデア:最初に左サブツリーをトラバースし、次に右サブツリーをトラバースし、最後にルート
HIDJEBKFGCAにアクセスします。
ここに画像の説明を挿入

4.レベルトラバーサルの
アイデア:上から小へ、
ABCDEFJHIJKを左から右へトラバースします。
ここに画像の説明を挿入

二分木コード

二分木実装コード

// An highlighted block

3つの二分木インタビューの質問

1.二分木でノードの数を見つけます

// An highlighted block

2.二分木の深さ(高さ)を見つけます

// An highlighted block

3.二分木で葉ノードの数を見つけます

// An highlighted block

4.二分木のプレオーダートラバーサルとミドルオーダートラバーサルがそれぞれABDEGCFHとDBGEACHFであることを知っているので、バイナリツリーのポストオーダートラバーサルとは何ですか。

二分木のバイのプレオーダートラバーサルとミドルオーダートラバーサルがそれぞれABDEGCFHとDBGEACHFであるとすると、バイナリツリーのzhiポストオーダートラバーサルdaoはDGEBHFCAです。

プレオーダートラバーサルの最初のノードはルートノードです。プレオーダートラバーサルから、Aはルートノードです。インオーダートラバーサルのルートノードの前のノードはすべて左側のサブツリーのノードであるため、左側のサブツリーのノードはDBGEです。ルートノードと左側のサブツリーノードを削除すると、右側のサブツリーノードはCHFになります。プレオーダートラバーサルの2番目のノードはBです。2から、Bが左側のサブツリーノードであることがわかります。したがって、Bは左側のサブツリーのルートノードです。

これはプレオーダーでトラバースされ、DEGはノードBの下にあり、ミドルオーダーでトラバースされます。DはBの左側のノードであり、GEはBの右側のノードです。プレオーダーでトラバースされたEは、Gのルートノードであり、ミドルオーダーでトラバースされ、GはEの左の子ノードです。プレオーダーによってトラバースされたCは、バイナリツリーの右ルートノードであり、ミドルオーダーによってトラバースされ、Cには左の子ノードが含まれず、HFはCの右の子ノードです。プレオーダーでトラバースします。FはHのルートノード、ミドルオーダーでトラバースし、HはFの左の子ノードです。

二分木では、左と右、次にルートの順でトラバーサルします。つまり、最初に左のサブツリーをトラバースし、次に右のサブツリーをトラバースし、最後にルートノードにアクセスします。次に、二分木のポストオーダートラバーサルはDGEBHFCAです。

ここに画像の説明を挿入

5.バイナリツリーが与えられた場合、プレオーダートラバーサルのノード順序は次のとおりです。ABDEGHCFI、ミドルオーダートラバーサルのノード順序は次のとおりです。DBGEHAFCI、後続のトラバーサルの順序は何ですか。

二分木が与えられた場合、プレオーダートラバーサルのノード順序はABDEGHCFI、ミドルオーダートラバーサルのノード順序はDBGEHAFCI、後続のトラバーサルのノード順序はDGHEBFICAです。

ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/m0_37882192/article/details/109228263