データ構造:二分木の考え方(基本アルゴリズム)

目次

1. 有向木のグラフ理論基礎

1. 有向木に関する基本概念

有向木の基本的な定義:

有向木のノードの次数:

有向木の次数:

有向木のルート ノード、ブランチ ノード、およびリーフ ノード: 

ツリーのサブツリー:

ツリー ノードの階層:

木の高さ:

2. 基本的な数学的結論

3.順序付き有向木

2. データ構造におけるツリーの順次格納構造と連鎖格納構造

1. データ構造の物理構造と論理構造

2. 物理構造は、シーケンステーブル (配列) のツリーデータ構造です

3. 物理構造は連結リストのツリーデータ構造

3.二分木

1. 二分木の基本概念 

2. 2 つの重要な特別な二分木

3. 二分木に関するいくつかの一般的な数学的結論

(1). 結論の最初のセット 

(2). 結論の 2 番目のセット (配列による二分木を実現するためのアルゴリズムの基礎)


1. 有向木のグラフ理論基礎

基本補題:単純な無向接続グラフ G (ノード数が 2 以上) にサイクルがない場合、次数 1 のノードが少なくとも 2 つ存在します 

この記事で説明するツリーは有向ツリーです 

1. 有向木に関する基本概念

  • 有向木の基本的な定義:

T が有限ノード から構成される有向単純連結グラフであり、T の無向基底グラフループがないと仮定すると、T は有向木と呼ばれます。

  • 有向木のノードの次数:

 ノードの入次数: 既存のツリー ノード A、A で終わる有向エッジの数は、ノード A の入次数と呼ばれます。

ノードの出次数: 既存のツリー ノード A、A から始まる有向枝の数をノード A の出次数と呼びます。

ノードAで終わる有向エッジのもう一方の端にあるノードは、 A のノードと呼ばれます。

ノードAから始まる有向枝のもう一方の端にあるノードは、 Aの子ノードと呼ばれます。

  •  有向木の次数:

有向木の次数=木内のすべてのノードの出次数の最大値:

  • 有向木のルート ノード、ブランチ ノード、およびリーフ ノード: 

  1. ルート ノードの入次数は 0 です
  2. 葉ノードの出次数は 0
  3. 入次数と出次数が 0 でない他のノードは、ツリーのブランチ ノード と呼ばれます。 
  •  ツリーのサブツリー:

有向木 T のルート ノードを削除すると、図に示すように、ツリーはいくつかの切断されたサブツリーに分割されます。

上の図の T のサブツリー t1、t2、および t3 は、ツリー グラフがいくつかの葉に分割されるまで、同じ方法でより小さなサブツリーに分割できます。

注:ルート ノードが 1 つしかないツリー構造ではサブツリー間にパスはありません (そうしないと、グラフにループが発生します) 。

  • ツリー ノードの階層:

ルートノードから数えて有向をたどりルートノードから特定のノードまでたどったノードの数を特定ノードのレベルと呼ぶ

  1.  同じレベルで同じ親ノードを持つノード兄弟ノードです(上図の E と F など)。
  2.  同じレベルで親ノードが異なるノードはいとこのノードです(上図の F と G など)。
  • 木の高さ:

ツリーのすべてのノードの階層における最大値は、ツリーの高さと呼ばれます。たとえば、上の図のツリーの高さは 4 です。

2. 基本的な数学的結論

  • ツリーに関する基本的な命題:ツリーに n 個のノードと m 個の有向エッジがある場合、m=n-1 ;

この特性は、数学的帰納法によって証明できます。

  1. 明らかに、n=1 の場合、m=0、m=n-1 が成立します。
  2. n=k(k>=1) のときに命題が真であると仮定します。つまり、 kのノードを持つ任意の木には k-1 個のエッジがあります
  3. ツリー G が n=k+1 個のノード (k>=1) をもつ場合エッジの数は m ですG にはループがないので、基本補題G によれば、次数 (出次数 + 入次数) が 1 のノードが存在しなければならず、このノードを u とします。G からノード u を削除します(エッジとノードを同時に削除するのと同じです)定義によれば、 G は依然としてツリーです ( n=k の場合の仮定 2 によると) G には k 個のノードがあるため、k 個のノードがあります。 - 1 エッジなので、m=(k-1)+1=k=n-1 ( u ノードを追加すると、それに応じてエッジの数が 1 増加します)。(つまり、 n=k のときに命題が真である場合、n=k+1 のときにも命題が真であり、 n=1 から任意の数のノードを持つツリーを構築すると、m=n-1 も満たされます)

証明プロセスは、ツリーが再帰的に論理的に構築されていることを完全に反映しています。

解析ツリーの構成図は、次のことを示しています。

  • ルート ノードが 1 つだけの有向木が構築される場合有向木の各サブツリーのルート ノードは1 つだけの親ノードを持ち 0 個以上の子ノードを持つことができます。
  • 同時に、ルート ノードが 1 つしかないツリー構造では、ツリーのサブツリー間にパスがないことを簡単に知ることができます。

3.順序付き有向木

フルツリーの概念:

  • (単一のルート ノード) ツリー T の高さが h (h>1)、次数が k (k>=1) であるとします (ツリー内のノードの数は 1 より大きい)
  • ツリー T に対応する完全なツリーの概念:高さが h でルート ノード各ブランチ ノードの出次数が k であるツリー。

順序付けられた有向木:

  • 順序付けられた有向木の各ノードには、独自の固定番号があります
  • データ構造で説明するツリーは、通常、ルート ノードが 1 つの順序付けられた有向ツリーです。

 順序付き有向木の各ノードの番号付け規則:

  1. ここで、高さ h と次数 k (h>1,, k>=1) を持つ (単一のルート ノードの) 木 T があるとします。
  2. 最初にツリー T に対応する完全なツリーを作成します
  3. ツリー T に対応する完全なツリーのノードに、低いものから高いもの、左から右の順に番号を付けます
  4. 完全なツリー内の各ノードの数に従って、ツリー Tの対応する位置にあるノードに番号を付けます。

例えば:

2. データ構造におけるツリーの順次格納構造と連鎖格納構造

ツリーのノードがメモリ ブロックと見なされる場合ノード間の有向線分はメモリ ブロック間の関連付けと見なされます(この関連付けは、ポインタまたは配列の添字関係によって確立されます)。メモリ内に形成されるデータ構造はツリーです。データ構造

1. データ構造の物理構造と論理構造

  • データ構造の物理構造とは、メモリ内のデータ構造の実際の分散モデルを指します。
  • データ構造の論理構造は、データ構造の抽象的な分析モデルを指します

データ構造のタイプは主にその論理構造に依存しその論理構造と物理構造の間の関係は論理マッピングによって確立されます

2. 物理構造は、シーケンステーブル (配列) のツリーデータ構造です

  • データ構造で説明するツリーは、通常、ルート ノードが 1 つの順序付けられた有向ツリーです。
  • 次数 2 の非完全木 T がある
  • 最初に、ツリー Tに対応する完全なツリーの各ノードに、低レベルから高レベル左から右の順に番号を付けます。
  •  これから、ツリー T の各ノードの数を取得できます。
  • ツリー T の各ノードの数に応じて、このツリーを配列にマッピングできます。
  • ノード番号と配列添字の絶対マッピングにより配列を介してツリー データ構造 (順序付き有向ツリー) を実装できます。 
  • シーケンス テーブルによって実装されるツリーでは、非常に古典的な例はヒープ (ルート ヒープのサイズ) です。

3. 物理構造は連結リストのツリーデータ構造

構造体型を定義できます。

typedef int DataType;
struct Node
{
    struct Node* _firstChild1;  // 第一个孩子结点
    struct Node* _pNextBrother; // 指向其下一个兄弟结点
    DataType _data;             // 结点中的数据域
};
  • _firstChild1 は、ノードの最初の子ノードを指すために使用されます(番号の意味で最初のもの(左側))
  • _pNextBrother は、ノードと同じレベルにあり同じ親ノードを持つ兄弟ノードを指すために使用されます。

ツリーがあります:

連鎖ストレージ構造で実装します。

_firstChild1 ポインターを介して、ツリーの深度トラバーサルを実現できます。

_pNextBrother ポインターを介して、ツリーの横方向のトラバーサルを実現できます。

3.二分木

1.二分木の基本概念 

二分木はノードの有限集合です:

  1. 二分木の次数は 2 です。つまり、出次数が 2 より大きいノードはありません。
  2. 二分木ノードの子ノードは、左右の子 (左と右の子) に分割され、順序を逆にすることはできません。二分木は、順序付けられた有向木です(各ノードには、対応する独自の固定番号があります)。
  3. データ構造では、単一ノードの二分木について話している

任意の二分木について、次状況で構成されます。

2. 2 つの重要な特別な二分木

  • フル バイナリ ツリー:ルート ノードと各ブランチ ノードの出次数が 2 の場合、バイナリ ツリーはフル バイナリ ツリーです。ノードの総数の観点からの分析:二分木の層の数が K でありノードの総数が 2^k - 1 (幾何学的シーケンスの合計)である場合、それは完全な二分木です。
  • 完全な二分木:完全な二分木は非常に効率的なデータ構造です.高さ K でノードが n 個の二分木
    では、そのすべてのノードに 1 から n までの番号が付けられている場合にのみ、完全な二分木と呼ばれます.連続配置(完全二分木のノード番号付けの特徴に基づいて、配列を使用して完全二分木を実現すると、メモリ使用率が高くなります)

完全な二分木には、1 つの特徴があります。

完全な二分木の高さが k (k>1) の場合、最初の k-1 層のすべてのノードで構成される部分構造は完全な木です。

  •  配列による完全二分木非完全二分木の比較: 完全二分木の利点がわかります
  •  データ構造ヒープは、シーケンス テーブル (配列) で実装された完全なバイナリ ツリーです(ヒープは、ヒープ ソート アルゴリズムの構造的基礎です)。

3. 二分木に関するいくつかの一般的な数学的結論

次に、後続のアルゴリズム学習で使用される二分木に関する数学的結論を2 セット与えます。

(1). 結論の最初のセット 

  • 任意の二分木について、出次数が 0 である場合、葉ノードの数は N0 であり出次数 2 の枝ノードの数は N2 (ルートを含む) であり、N0=N2+1 です。

証明:

二分木の出次数が 1 の枝ノードの数を N1 とする.

この場合、バイナリ ツリーのエッジの総数は次のようになります。2*N2 + N1;

二分木の要約点の数は、N0 + N1 + N2です。

第 1 章のセクション 2 の基本的な数学的結論によると: 2*N2 + N1 = N0 + N1 + N2 -1 (ツリーのエッジの総数 = ノードの数 -1 )

N0 = N2 +1; (つまり、二分木では、出次数が 0 のリーフは、出次数が 2 の枝ノード(ルートを含む)より常に1 つ多い)

(2). 結論の 2 番目のセット (配列による二分木を実現するためのアルゴリズムの基礎)

  • 定理 1: n 個のノードを持つ完全な二分木の場合、第 1 章のセクション 3 で説明されている番号付け規則に従ってそのノードに番号を付けます (ルート ノードには 0 の番号が付けられ、完全な二分木の各ノードの番号は 0~n- 1)の場合、ノード番号 childについて次の結論が導き出されます: child>0 の場合、子番号ノードの親ノード番号parent = (child-1)/2 ; child=0 の場合、ノードには親ノードがありません;
  •  

定理 1 の証明図:

  • 定理 2: n 個のノードを持つ完全な二分木の場合、各ノードは、第 1 章のセクション 3 で説明されている番号付け規則に従って番号付けされます(ルート ノードには 0 の番号が付けられ、完全な二分木の各ノードの番号は 0~n です)。 -1)の場合、ノード番号の親について次の結論を導き出すことができます: 2*parent+1<nの場合ノードの左の子ノード番号leftchild を取得できます= 2*parent+1 ; 2*parentの場合+1>=nの場合、ノードには左の子がありません (この結論は定理 1 の逆です)
  • 定理 3: n 個のノードを持つ完全な二分木の場合、各ノードは、第 1 章のセクション 3 で説明されている番号付け規則に従って番号付けされます(ルート ノードには 0 の番号が付けられ、完全な二分木の各ノードの番号は 0~n です)。 -1)の場合、 parent と番号付けされたノードについて次の結論を導き出すことができます: 2*parent+2<nの場合、ノードの右の子ノード番号rightchildを取得できます2*parent+2 ; 2*parentの場合+2>=nノードには右の子がありません(この結論は定理 1 の逆です)

定理 2 と 3 の証明分析図:

この一連の定理を使用すると、親ノードの数を通じてその左右の子ノードの数を見つけることができ、次に、子ノードの数を通じてその親ノードの数を見つけることができます(このセットの定理は、配列によるヒープの実現の基礎を築きます. アルゴリズムの基礎)

  • この一連の定理は、後続のヒープ実装でヒープ要素の挿入と削除のインターフェイス要素調整アルゴリズムで使用されます。

おすすめ

転載: blog.csdn.net/weixin_73470348/article/details/129196657