私の連絡先情報
郵便メール:
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
基本的なデータ構造 | 関連する知識ポイント | クリックできます | 以下のリンクから学習してください | 一緒に頑張りましょう! |
---|---|---|---|---|
時間と空間の複雑さの詳細な分析 | シーケンス テーブルの詳細な分析: 基礎となるロジックの調査 | 単一リンクリストの詳細な分析: 基礎となるロジックの探索 | 主要な双方向循環リンク リストの詳細な分析: 基礎となるロジックの探索 | スタックを深く掘り下げる: 基礎となるロジックを調査する |
キューの詳細な分析: 基礎となるロジックの調査 | 循環キューの詳細な分析: 基礎となるロジックの調査 |
この記事では、バイナリ ツリーについてさらに学ぶために、ツリーとバイナリ ツリーに関連する概念から始めます。
🌈个人主页:それはウェイターです
🌈C语言笔记专栏:C言語のメモ
🌈C++笔记专栏: C++ のメモ
🌈初阶数据结构笔记专栏: 基本的なデータ構造に関する注意事項
🌈喜欢的诗句:无人扶我青云志 我自踏雪至山巅
ツリーは非線形データ構造であり、次のもので構成されます。n(n>=0)
限られたノードが階層関係を持った集合を形成しますが、ツリーは実際にはほとんど価値がありませんが、二分木の方がより実用的な価値があります (この集合がツリーと呼ばれる理由は、根が上を向き、葉が付いているためです)。下を向くとまるで木のように見えます)
M(M>0)
素集合T1、T2、....、Tm
の各セットTi(1<=i<=m)
これは、ツリーと同様の構造を持つ別のサブツリーです。各サブツリーのルート ノードには 1 つのみの先行ノードがあり、0 個以上の後続ノードを持つことができます。木構造は線形テーブルに比べて複雑なため、値の範囲とノード間の関係の両方を保存する必要があります。
これまでの知識に基づいたいくつかの方法を次に示します。
typedef int DataType;
struct Node
{
struct Node* _firstChild1; // 第一个孩子结点
struct Node* _pNextBrother; // 指向其下一个兄弟结点
DataType _data; // 结点中的数据域
};
もちろん、上記の方法に限定されるものではなく、親式、子式、子親式、子兄弟式等もある。ここでは、最も一般的に使用されるものを簡単に説明します子供の兄弟の代表
バイナリ ツリーはノードの有限セットです。このセットには次の 2 つの状況が考えられます。
この図から 2 つの結論が導き出されます:
二分木には次数が 2 より大きいノードはありません
二分木の部分木は左右の部分木に分割でき、順序を逆にすることはできないため、二分木は順序付き木となります。
知らせ: どのバイナリ ツリーでも、次の状況で構成されます (空の木の状況は最も忘れられやすい)
簡単にまとめると:
完全なバイナリ ツリーのすべてのレベルがいっぱいです
完全な二分木の高さが n の場合、最初の n-1 レベルはいっぱいですが、最後のレベルはいっぱいではない可能性があります。ただし、左から右に連続している必要があります
完全なバイナリ ツリーは非常に効率的なデータ構造であり、完全なバイナリ ツリーは特殊なタイプの完全なバイナリ ツリーです。
完全なバイナリ ツリーは、完全なバイナリ ツリーの必要十分条件です。
これは通常の二分木であり、左から右へ連続していません。
バイナリ ツリーは通常、2 つの構造で格納できます。1 つはシーケンシャル構造、もう 1 つはチェーン構造です。
シーケンシャル構造ストレージは配列を使用して格納することですが、一般に、配列は完全なバイナリ ツリーを表す場合にのみ適しています。バイナリ ツリーがいっぱいでない場合、実際にはヒープのみがストレージに配列を使用するため、スペースが無駄になります。バイナリ ツリーの逐次ストレージは物理的には配列であり、論理的にはバイナリ ツリーです。次の質問を解くには、物理的な配列と論理的なバイナリ ツリーの組み合わせを使用する必要があります。
leftchild = parent * 2 + 1;
rightchild = paretn * 2 +2;
parent = (child - 1) / 2;
(左右の子の区別はありません)
3点目については個人的な推論ですが、leftchild
添え字は次のように分割されますleftchild- 1
そして1
、のためにleftchild-1
のためにparent
下付き文字を 2 回付けます。(child - 1) / 2
オペレーターは、leftchild
として取り出します1
部分的に 2 で割った整数は 0、leftchild -1
その一部は次のように見ることができますleftchild
、そしてrightchild与leftchild相差1
、なぜならrightchild = leftchild - 1
そして上を通してleftchild - 1 ~= leftchild
、と推測できます。rightchild = leftchild(在进行/2运算,取整数情况下)
バイナリ ツリーのリンクされたストレージ構造とは、リンク リストを使用してバイナリ ツリーを表現すること、つまり、チェーンを使用して要素の論理関係を示すことを指します。 通常の方法では、リンク リストの各ノードは、データ フィールドと左右のポインタ フィールドという 3 つのフィールドで構成されます。左右のポインタは、左の子と右の子が指すリンクのストレージ アドレスを指定するために使用されます。ノードのそれぞれが配置されます。連鎖構造は 2 進連鎖と 3 分岐連鎖に分けられます。現在、私たちの研究では一般に 2 進連鎖が使用されます。その後、赤黒ツリーなどの高次のデータ構造を学習する場合には、3 分岐連鎖が使用されます。
typedef int BTDataType;
// 二叉链
struct BinaryTreeNode
{
struct BinTreeNode* _pLeft; // 指向当前节点左孩子
struct BinTreeNode* _pRight; // 指向当前节点右孩子
BTDataType _data; // 当前节点值域
}
// 三叉链
struct BinaryTreeNode
{
struct BinTreeNode* _pParent; // 指向当前节点的双亲
struct BinTreeNode* _pLeft; // 指向当前节点左孩子
struct BinTreeNode* _pRight; // 指向当前节点右孩子
BTDataType _data; // 当前节点值域
};
シーケンシャル構造のストレージは配列を介して保存されます。一般に、配列は完全なバイナリ ツリーにのみ適しています。不完全なバイナリ ツリーは、配列構造のストレージには適していません。 。しかし実際には、配列はヒープが使用される場合にのみストレージとして使用され、そのほとんどはチェーン構造を介して保存されます。
その理由は:
以上がこの記事の内容です、読んでいただいた皆様、ありがとうございました!基本データ構造に関する Dian Xiaoer のメモが、基本データ構造の学習に役立つことを願っています。