[二分木のフロンティア] 木
1 木の概念
ツリーは非線形データ構造であり、n (n>=0) 個の有限ノードで構成される一連の階層関係です。根が上を向き、葉が下を向いているという意味で、逆さまの木に見えることからツリーと呼ばれています。。
- ツリーには、と呼ばれる特別なノードがあります。ルートノード、ルートノードには先行ノードがありません。
- ルート ノードを除く他のノードは M (M>0) 個の素集合 T1、T2、...、Tm に分割され、各集合 Ti (1<= i <= m) は構造とツリー状のサブツリーです。各サブツリーのルート ノードには 1 つのみの先行ノードがあり、0 個以上の後続ノードを持つことができます。。
ヒント: ツリー構造では、サブツリー間に交差があってはなりません。そうでない場合、それはツリー構造ではありません。
2. ツリーの関連概念
①ノードの次数: ノードに含まれる部分木の数をノードの次数といい、上図に示すように、A は 6 です。
②葉ノードまたは終端ノード: 次数 0 のノードを葉ノードと呼びます; 上図に示すように、B、C、H、I などのノードが葉ノードです。 ③非終端ノードまたは
分岐ノード: 0 以外の次数を持つノード; 上図に示すように: D、E、F、G... などのノードは分岐ノードです。
④親ノードまたは親ノード: ノードに子ノードが含まれる場合、このノードはその子ノードの親ノードと呼ばれます; 上図に示すように: A は B の親ノードです。
⑤子ノードまたは子ノード: ノードに含まれるサブツリーのルート ノードは、そのノードの子ノードと呼ばれます; 上の図に示すように: B は A の子ノードです。
⑥兄弟ノード: 同じ親ノードを持つノードを兄弟ノードと呼びます; 上図に示すように: B と C は兄弟ノードです
⑦ ツリー次数: ツリー内で最大のノードの次数をツリー次数と呼びます; 図に示すように、 B と C は兄弟ノードです。上の図では: ツリー 次数は 6 です。
⑧ノードの階層: ルートの定義から始まり、ルートが第 1 層、ルートの子ノードが第 2 層、というようになります。
⑨ツリーの高さまたは深さ: ツリー内のノードの最大レベル; 上の図に示すように: ツリーの高さは 4 です。
⑩いとこノード: 親が同じ階層にあるノードはいとこであり、上図に示すように、H と I は兄弟ノードです。
⑪ノードの祖先: ルートからこのノードまでのブランチ上のすべてのノード。上の図に示すように: A はすべてのノードの祖先です。
⑫子孫: ノードをルートとするサブツリー内の任意のノードをノードの子孫と呼びます。上に示すように、すべてのノードは A の子孫です。
⑬森林: m (m>0) 個の互いに素な木の集合を森林といいます。
3. ツリー表現
木構造は線形テーブルに比べて複雑で、保存や表現が面倒です。値の範囲が保存されるため、ノードとノード間の関係も保存されます。
実際には、ツリーを表現するには、親表現、子表現、子の親表現、子の兄弟表現など、さまざまな方法があります。ここで私たちはそれを単純に理解します最も一般的に使用される子の兄弟表記。
コード:
typedef int DataType;
struct Node
{
struct Node* _firstChild1; // 第一个孩子结点
struct Node* _pNextBrother; // 指向其下一个兄弟结点
DataType _data; // 结点中的数据域
};
4. ツリーの活用(ファイルシステムのディレクトリツリー構造を表現)
上記では、まず 2 行目の最初の子 bin を検索し、 bin は兄弟ノードを介して 2 行目の他の兄弟ノードを検索します。
そして、2 行目の最初のノードの子ポインタが空であるため、終端は下方向に訪問しなくなりました。
次に、2 行目の 2 番目のノードが子ポインタを介して 3 行目の最初のノードを見つけ、兄弟ノードを介して他の兄弟ノードを見つけます。
他のノードは上記のプロセスを繰り返し、最終的にすべてのデータを見つけます。