ツリー - バイナリツリー、バイナリツリートラバーサル(17)

ここに画像を挿入説明


A.バイナリツリー

1.バイナリツリーの定義

以下の条件は、二分木構造と呼ば満たされています。

1.ノードの各々は2以下です。

子ノードは、任意のノードあたり2の順序を逆にすることができません。


2.バイナリ木の性質

1つのプロパティ:バイナリツリー、2 ^(K-1)(k≥1)ノードまでにk番目の層。

プロパティ2:バイナリツリーの深さmが最も2M-1(M≧1)ノードに有します。

自然3:それはノードN0の端末番号であればいずれのバイナリツリーで、次数2のノードの数がN0 = N2 + 1、N 2です。

プロパティ4:バイナリツリーは、ノードおよび[]は整数部log2nのlog2nが取られる意味少なくとも[log2n] +1、深さNを有しています。

自然5:すべてのノードへの完全なバイナリツリーのn個のノードが上から下および左に1から始まるシーケンス番号の正しい順序であろうがある場合、そのノードの任意の数の私があります。

I = 1のように①、私は> 1として二分木のルートノードなし親、ノードI、I / 2の親ノードのシリアル番号です。

②2iが> N、次に数には左の子ノードI、例えば2I≤nが、iは2Iであるノードの子ノードのシリアル番号の左側にない場合。

③2I + 1> N、ノードの数がIない右の子、そのような2I + 1≤nは、その後数iが2I + 1でノードの右の子ノードのシリアル番号です。


3.バイナリストレージ構造

バイナリツリー構造は、各ノードは2つの後継まで持つことができ、非直線的です。順次ストレージ構造とチェーンのストレージ構造に分かれて格納するバイナリツリー構造。


1)。シーケンシャルストレージ構造

下に示すように順次記憶構造は、一次元アレイを用いて実施することができます。
ここに画像を挿入説明


バイナリツリーは完全2分木であるとき、わかるように、このストレージ構成は非常に便利ですが、スペースが無駄にされていないが、バイナリツリーの平均のために保存されている完全なバイナリツリーに作成する「仮想ノード」、でなければなりません:以下のように、スペースの無駄が生じ
ここに画像を挿入説明
そのため、注文が完了し、バイナリツリーに適用一般的に保存されている、それは以下のように、あなたは、チェーンストアを使用することができ、バイナリツリーのストレージニーズを満たすために保存することができないため。


2)。ストレージ構造

ここに画像を挿入説明
[lchindデータrchild]:任意のバイナリツリーの各ノードは、(ルートを除く)唯一の親ノード、二人の子供までを有し、それは図1に示す構造に設計することができます。バイナリツリーはまた、バイナリリストと呼ばれています。


3)。ジャンクションコードの実装

バイナリコードは、以下のことを実現するために、リストノード構造をリンク:

typedef struct Node
{
    DataType data;
    struct Node * LChild;
    struct Node * RChild;
}BiTNode,*BiTree;

II。バイナリツリートラバーサル(フォーカス)

1.エルゴード理論コース

ここに画像を挿入説明
左のサブツリーはトラバーサル、根、LDR、トラバーサル順序は、次の6種類の右部分木を表している場合:

①ルートへのアクセスは、左のサブツリーを横断し、右のサブツリーをトラバース。DRLと呼ば

②ルートへのアクセスを、トラバースは、右のサブツリーを横断し、サブツリーを残しました。DLRで表さ

③右のサブツリーを横断し、左の部分木、rootアクセスをトラバース。LDRと呼ば

④左のサブツリーを横断し、右部分木、rootアクセスをトラバース。RDLと呼ば

⑤右のサブツリー、rootアクセスを横断し、左のサブツリーをトラバース。LRDによって示されます

⑥トラバースは、右のサブツリーのトラバースは、ルートアクセスをサブツリーを残しました。RLDとして記録

注文が最初に左と右のトラバーサルで指定された場合は、3つだけ残っている:DLR、LDR、LRD。

次に、ルートのアクセス順序に応じて、それぞれ、LDRの順序トラバーサルに、LRDは、後順トラバースフロントDLR順トラバーサルであることを特徴とします。


ここに画像を挿入説明
:上述したバイナリツリーの
先行順トラバース配列:ABDECFG
プレオーダー配列:DBEAFCG
後順配列:DEBFGCA

これを書いて、私はそれがより便利孟新しい理解になると思います。

プレオーダートラバーサル配列:(A)(B(DE ))(C(FG))
INORDERトラバーサル順序:((D)B(E ))(A)((F)C(G))
後順トラバーサル順序:((DE)B)(( FG)C)(A)

先将大头写下来然后进行填写,类似于填空,但是仅限于帮助你理解遍历顺序,而不是让你使用这个方法记忆遍历顺序,我们应该通过辅助工具来帮助我们真正了解。


ここで再び手と思想:
ここに画像を挿入説明

書くために試してみて、それが答えとして、あなたが学んだことを示しているかのように、以下では、同じではありません!
予約限定トラバーサル:ABDFGCEH
行きがけ:BFDGACEH
後順トラバーサル:FGDBHECA

次のコードは、種々のトラバーサルを実装するために使用されます。


2.先行順走査

void PreOrder(BiTree root)
{ // root为指向二叉树或某一树的根结点
    if(root!=NULL)
    {
        Visit(root->data); // 访问根结点,显示数据结点
        PreOrder(root->LChild);// 遍历左子树
        PreOrder(root->RChild);// 遍历右子树
    }
}

3.予約限定!

void PreOrder(BiTree root)
{
    if(root!=NULL)
    {
        PreOrder(root->LChild);
        Visit(root->data)
        PreOrder(root->RChild);
    }
}

4.後順

void PreOrder(BiTree root)
{
    if(root!=NULL)
    {        
        PreOrder(root->LChild);
        PreOrder(root->RChild);
        Visit(root->data);
    }
}

知識の理論は非常にバイナリツリートラバーサルのために複雑な、しかし、バイナリツリーによる構造の再帰的な定義であるが、最初の注文は、順番に、後に、それが再帰的に定義されています。したがって、再帰的なバイナリツリートラバーサルモード符号量小さいです。


間違っている場合は、正しい私の批判を喜ば、コメントを歓迎します。
それぞれのテキスト文:誰もあなたの貧しい人々のために責任を負うことになります、あなたは拍手豊かな人がいます!だから、誰か他の人の口の中で生き、自分自身をしません!大胆に、あなたは夢を持って飛ぶ;道路があり、大胆に離れて行く前方道、人々停止を恐れていない、私は自分自身を恐れ降伏よ!

公開された74元の記事 ウォンの賞賛180 ・は 30000 +を見て

おすすめ

転載: blog.csdn.net/Fdog_/article/details/104782153