C でバイナリ ツリーを実装する方法は?

C Debainari Tsuriwo Shi Zhuangsuru Fang Faha



ツリーは、階層的に含まれる情報を格納するための一般的なデータ形式です。ツリーはエッジでリンクされたノードで構成され、各ノードには親ノードと 1 つまたは複数の子ノードがあります。この記事の研究と分析 二分木 そして実装を見る 二分木 Cプログラミングで。

C の二分木

Cでは、 二分木 最大 2 つの子ノードを持つ親ノードを持つツリー データ構造のインスタンスです。 0、1、または 2 つの子孫ノード。内のすべてのノード 二分木 には、独自の値と、その子への 2 つのポインター (左の子用のポインターと右の子用のポインター) があります。

二分木の宣言

二分木 と呼ばれるオブジェクトを使用して C で宣言できます。 構造体 ツリー内のノードの 1 つを表します。







構造体 ノード {

データ型 var_name ;

構造体 ノード * ;

構造体 ノード * ;

} ;

上記は1つの宣言です 二分木 ノードとしてのノード名。 3 つの値を保持します。 1 つはデータ格納変数で、他の 2 つは子へのポインタです。 (親ノードの左右の子)。



二分木の事実

大規模なデータ セットの場合でも、 二分木 検索がより簡単かつ迅速になります。木の枝の数に制限はありません。アレイとは対照的に、あらゆる種類のツリーは、個人の要求に基づいて作成および増加できます。



C でのバイナリ ツリーの実装

以下は、実装の段階的なガイドです。 二分木 Cで。





ステップ 1: 二分探索木を宣言する

data、*left_child、*right_child などの 3 種類のデータを持つ構造体ノードを作成します。データは整数型にすることができ、*left_child ノードと *right_child ノードの両方を NULL として宣言することも、宣言しないこともできます。

構造体 ノード

{

整数 データ ;

構造体 ノード * right_child ;

構造体 ノード * left_child ;

} ;

ステップ 2: 二分探索木に新しいノードを作成する

引数として整数を受け取り、その値で作成された新しいノードへのポインタを提供する関数を作成して、新しいノードを作成します。作成されたノードの動的メモリ割り当てには、C の malloc() 関数を使用します。左右の子を NULL に初期化し、nodeName を返します。



構造体 ノード * 作成 ( データ型データ )

{

構造体 ノード * ノード名 = malloc ( のサイズ ( 構造体 ノード ) ) ;

ノード名 -> データ = 価値 ;

ノード名 -> left_child = ノード名 -> right_child = ヌル ;

戻る ノード名 ;

}

ステップ 3: 二分木に右と左の子を挿入する

挿入される値と、両方の子が接続されるノードへのポインターである 2 つの入力を受け入れる関数 insert_left および insert_right を作成します。 create 関数を呼び出して新しいノードを作成し、返されたポインターをルートの親の左の子の左ポインターまたは右の子の右ポインターに割り当てます。

構造体 ノード * insert_left ( 構造体 ノード * データ型データ ) {

-> = 作成 ( データ ) ;

戻る -> ;

}

構造体 ノード * insert_right ( 構造体 ノード * データ型データ ) {

-> = 作成 ( データ ) ;

戻る -> ;

}

ステップ 4: 走査法を使用して二分木のノードを表示する

C では、3 つのトラバーサル メソッドを使用してツリーを表示できます。これらのトラバーサル メソッドは次のとおりです。

1: 事前注文トラバーサル

このトラバーサル メソッドでは、次の方向にノードを通過します。 親ノード -> 左子 -> 右子 .

空所 予約注文 ( ノード * ) {

もしも ( ) {

printf ( '%d \n ' -> データ ) ;

display_pre_order ( -> ) ;

display_pre_order ( -> ) ;

}

}

2: ポストオーダー トラバーサル

この走査方法では、ノードからの方向にノードを通過します。 left_child->right_child->parent_node-> .

空所 display_post_order ( ノード * ) {

もしも ( binary_tree ) {

display_post_order ( -> ) ;

display_post_order ( -> ) ;

printf ( '%d \n ' -> データ ) ;

}

}

3: インオーダートラバーサル

このトラバーサル メソッドでは、次の方向にノードを通過します。 left_node->root_child->right_child .

空所 display_in_order ( ノード * ) {

もしも ( binary_tree ) {

display_in_order ( -> ) ;

printf ( '%d \n ' -> データ ) ;

display_in_order ( -> ) ;

}

}

ステップ 5: バイナリ ツリーで削除を実行する

作成したものを削除できます 二分木 次のように、C の親ノード関数で両方の子を削除します。

空所 delete_t ( ノード * ) {

もしも ( ) {

delete_t ( -> ) ;

delete_t ( -> ) ;

無料 ( ) ;

}

}

二分探索木のCプログラム

以下は、C プログラミングでの二分探索木の完全な実装です。

#include

#include

構造体 ノード {

整数 価値 ;

構造体 ノード * * ;

} ;

構造体 ノード * ノード1 ( 整数 データ ) {

構造体 ノード * tmp = ( 構造体 ノード * ) malloc ( のサイズ ( 構造体 ノード ) ) ;

tmp -> 価値 = データ ;

tmp -> = tmp -> = ヌル ;

戻る tmp ;

}

空所 印刷する ( 構造体 ノード * root_node ) // ノードを表示します!

{

もしも ( root_node != ヌル ) {

印刷する ( root_node -> ) ;

printf ( '%d \n ' root_node -> 価値 ) ;

印刷する ( root_node -> ) ;

}

}

構造体 ノード * insert_node ( 構造体 ノード * ノード 整数 データ ) // ノードの挿入!

{

もしも ( ノード == ヌル ) 戻る ノード1 ( データ ) ;

もしも ( データ < ノード -> 価値 ) {

ノード -> = insert_node ( ノード -> データ ) ;

} それ以外 もしも ( データ > ノード -> 価値 ) {

ノード -> = insert_node ( ノード -> データ ) ;

}

戻る ノード ;

}

整数 主要 ( ) {

printf ( 「二分探索木のC実装! \n \n ' ) ;

構造体 ノード * = ヌル ;

= insert_node ( 10 ) ;

insert_node ( 4 ) ;

insert_node ( 66 ) ;

insert_node ( 4.5 ) ;

insert_node ( 9 ) ;

insert_node ( 7 ) ;

印刷する ( ) ;

戻る 0 ;

}

上記のコードでは、最初に ノード 使用して 構造体 .次に、新しいノードを「 ノード1 」を使用してメモリを動的に割り当てます malloc() 宣言されたノードを使用して、データと 2 つのポインター型の子を持つ C で。この後、ノードを表示します printf() 関数を呼び出して 主要() 関数。そうして 挿入_ノード() 関数が作成され、ノード データが NULL の場合 ノード1 それ以外の場合、データは ノード 左右の子の (親)。プログラムは、 主要() この関数は、いくつかのサンプル ノードを子として使用してノードを生成し、次に順序内トラバーサル メソッドを使用してノードの内容を出力します。

出力

結論

ツリーは、データを非線形形式で保持するためによく使用されます。 二分木 各ノード (親) が左の子と右の子の 2 つの子孫を持つツリーのタイプです。あ 二分木 は、データを転送および保存する多目的な方法です。 C の Linked-List と比較してより効率的です。上記の記事では、 二分木 の段階的な実装により、 二分探索木 Cで。