データ構造研究ノート(3つおよびバイナリツリー)

ツリーコンセプト
ツリーは非線形データ構造であり、n(n> = 0)の有限ノードで構成される階層コレクションです。逆さまの木のように見えるため、木と呼ばれます。つまり、根が上を向き、葉が下を向いています。次の特徴があります。各ノードには0個以上の子ノードがあり、親ノードのないノードはルートノードと呼ばれ、非ルートノードにはそれぞれ1つの親ノードしかありません。ルートノードを除くさらに、各子ノードは、複数のばらばらのサブツリーに分割できます。次の概念があり
ます。1。ノードの次数:ノードに含まれるサブツリーの数はノードの次数と呼ばれます
。2。リーフノードまたはターミナルノード:次数が0のノードはリーフノードと呼ばれます。3
。非ターミナルノードまたはブランチノード:次数が0でない
ノード; 4.親ノードまたは親ノード:ノードに子ノードが含まれている場合、このノードはその子ノードの親ノードと呼ばれます;
5.子ノードまたは子ノード:ノードに子が含まれていますツリーのルートノードはノードの子ノードと呼ばれます
。6。兄弟ノード:同じ親ノードを持つノードは互いに兄弟ノードと呼ばれます
。7。ツリーの次数:ツリーの最大ノードの次数はツリーの次数と呼ばれます。 ;
レベルノード8:定義のルートから開始し、最初のレイヤーはルート、2番目のレイヤーのルートの子など;ツリーの高さまたは深さ:ツリー内のノードの最大レベル;
9。ノードのいとこ:同じレベルの親のノードはいとこです;
10.ノードの祖先
ルートからノードへのブランチ上のすべてのノード; 11.子孫:ノードをルートとするサブツリー内のノードは呼び出されますこのノードの子孫。12。
フォレスト:m(m> = 0)のばらばらなツリーのコレクションはフォレストと呼ばれます。ツリー
の表現は
線形テーブルよりも複雑で、保存して表現するのが面倒です。実際、ツリーの表現方法には、親表現、子表現、子兄弟表現など、さまざまな方法があります。ここでは、最も一般的に使用される子兄弟表記について簡単に理解します。

typedef int DataType;
struct Node
{
 struct Node* _firstChild1; // 第一个孩子结点
 struct Node* _pNextBrother; // 指向其下一个兄弟结点
 DataType _data; // 结点中的数据域
};

バイナリツリー
バイナリツリーは、ノードの有限のセットです。セットは空であるか、ルートノードと左サブツリーおよび右サブツリーと呼ばれる2つのバイナリツリーで構成されます。各ノードには最大2つのサブツリーがあります。つまり、バイナリツリーには次数が2より大きいノードは存在しません。バイナリツリーのサブツリーは左右に分かれており、サブツリーの順序を逆にすることはできません。
特別なバイナリツリー

  1. 完全なバイナリツリー:バイナリツリー。各レイヤーのノード数が最大に達すると、バイナリツリーは完全なバイナリツリーになります。つまり、バイナリツリーのレイヤー数がKで、ノードの総数が(2 ^ k)-1の場合、それは完全なバイナリツリーです。
  2. 完全なバイナリツリー:完全なバイナリツリーは非常に効率的なデータ構造です。完全なバイナリツリーは完全なバイナリツリーから派生します。深さがKでノードがnのバイナリツリーの場合、各ノードが深さKの完全なバイナリツリーの1からnまでの番号が付けられたノードに対応する場合に限り、完全なバイナリツリーと呼ばれます。完全なバイナリツリーは、特別な種類の完全なバイナリツリーであることに注意してください。
    チェーンストレージ
    チェーンとは、バイナリツリー構造、つまりバイナリツリーを表すリンクリスト、つまりロジック要素のチェーンを格納することを意味します。通常の方法では、リンクリストの各ノードは、データフィールドと左右のポインタフィールドの3つのフィールドで構成されます。左右のポインタは、ノードの左右の子が配置されているリンクノードのストレージアドレスを指定するためにそれぞれ使用されます。チェーン構造は2つのフォークと3つのフォークに分けられ、通常は2つのフォークであり、赤黒の木などの高レベルのデータ構造は3つのフォークを使用します。
    二叉链
    struct BinaryTreeNode
    {
    struct BinTreeNode* _pLeft; // 指向当前节点左孩子
    struct BinTreeNode* _pRight; // 指向当前节点右孩子
    DataType _data; // 当前节点值域
    }
    三叉链
    struct BinaryTreeNode
    {
    struct BinTreeNode* _pParent; // 指向当前节点的双亲
    struct BinTreeNode* _pLeft; // 指向当前节点左孩子
    struct BinTreeNode* _pRight; // 指向当前节点右孩子
    DataType _data; // 当前节点值域
    };


    バイナリツリーのシーケンス構造通常のバイナリツリーは、スペースの浪費が多いため、アレイへの格納には適していません。完全なバイナリツリーは、シーケンシャルストレージに適しています。実際には、通常、ヒープ(バイナリツリー)を順次構造の配列に格納します。ここのヒープとオペレーティングシステムの仮想プロセスアドレス空間のヒープは、データ構造とオペレーティングシステムの管理の2つであることに注意してください。メモリの領域がセグメント化されます。
    ヒープ
    にキーコードセットK = {k0、k1、k2、...、kn-1}がある場合、そのすべての要素を完全なバイナリツリーの順序で1次元配列に格納し、次の条件を満たすようにします。Ki<= K2i +1およびKi <= K2i + 2(Ki> = K2i +1およびKi> = K2i + 2)i = 0、1、2 ...、これは小さな山(または大きな山)と呼ばれます。ルートノードが最大のヒープは最大ヒープまたはラージルートヒープと呼ばれ、ルートノードが最小のヒープは最小ヒープまたはスモールルートヒープと呼ばれます。ヒープ内のノードの値は常にその親ノードの値以上またはそれ以上であり、ヒープは常に完全なバイナリツリーです。

    typedef struct Heap
    {
    HPDataType* _a;
    int _size;
    int _capacity; 
    }Heap;

バイナリツリーチェーン構造の
トラバーサルいわゆるトラバーサル(Traversal)とは、特定の検索ルートをたどって、ツリー内の各ノードに1回だけアクセスすることを指します。アクセスノードによって実行される操作は、特定のアプリケーションの問題によって異なります。トラバーサルは、バイナリツリーで最も重要な操作の1つであり、バイナリツリーでの他の操作の基礎となります。プレオーダー/ミドルオーダー/ポストオーダーの再帰的構造トラバーサルは、アクセスノード操作の場所に応じて名前が付けられます。

  1. NLR:プレオーダートラバーサル(プレオーダートラバーサルとも呼ばれます)-ルートノードにアクセスする操作は、その左右のサブツリーをトラバースする前に発生します。
  2. LNR:インオーダートラバーサル-ルートノードにアクセスする操作は、左右のサブツリーをトラバースするときに発生します。
  3. LRN:ポストオーダートラバーサル-ルートノードにアクセスする操作は、その左右のサブツリーをトラバースした後に発生します。
    訪問したノードは特定のサブツリーのルートである必要があるため、N(ノード)、L(左サブツリー)、およびR(右サブツリー)は、ルート、ルートの左サブツリー、およびルートの右サブツリーとして解釈できます。NLR、LNR、およびLRNは、それぞれ、ファーストルートトラバーサル、ミドルルートトラバーサル、およびポストルートトラバーサルとも呼ばれます。
    階層的トラバーサル: 1次トラバーサル、中次トラバーサル、およびポストオーダートラバーサルに加えて、バイナリツリーも階層でトラバースできます。バイナリツリーのルートノードが1であると仮定すると、シーケンストラバーサルは、バイナリツリーのルートノードから開始し、最初に最初のレイヤーのルートノードにアクセスし、次に2番目のレイヤーのノードに左から右にアクセスし、次に3番目のレイヤーにアクセスします。レイヤーのノードなど、ツリーレイヤーのノードを上から下、左から右にレイヤーごとにアクセスするプロセスは、レイヤーシーケンストラバーサルです。

おすすめ

転載: blog.51cto.com/14289397/2545675