バイナリ・ソートツリーを達成するために、8608のさまざまなアルゴリズム
説明
バイナリソートツリーアルゴリズムの機能を実現する: (1)新しいノードの挿入 (2)プリアンブルにおいて、配列中、バイナリツリートラバーサル後 (3)非再帰的アルゴリズム横断 バイナリツリートラバーサルの(4)レベル (5)バイナリツリーは、所与のキー(1つの関数の戻り値の成功、失敗0)を見つけるために (6)各交換ノードの左及び右サブツリー (7)バイナリツリーの深さを見つける (8)ノードの葉の
入力
最初のライン:ノードN寄与の数を用意 第二行:スペースで区切られた入力nは整数 三行目:検索対象のキーワードが入力される 第4行に:で検索される入力キーワード 5行目:入力が挿入されますキーワード
出力
最初のライン:バイナリツリートラバーサルシーケンスプレオーダー 二行目:バイナリツリーシーケンスプレオーダー 三行目:後バイナリツリートラバーサルシーケンス順序 第4行は:検索結果の 第5行を:検索結果 行を第六の第八行に:挿入をシーケンスの最初の新しいノードの後のバイナリツリーは、先行予約 9行目のバイナリツリーの配列(非再帰的アルゴリズム)新しいノードトラバーサル配列を挿入した後に OK X:レベルバイナリツリーを新しいノードトラバーサル配列を挿入した後 13行目と11行目:配列先行予約内の各ノードの左及び右サブツリーの最初の交換の後に 16行目の14行目:左と右の第二のスイッチ・ノード最初のサブツリーの後、シーケンス内の先行予約 バイナリツリーの深さ:第十七行 十八行:ノードの葉の数を
サンプル入力
7 40 20 60 18 50 56 90 18 35 30
サンプル出力
40 20 18 60 50 56 90である 18 20 40 50 56 60 90である 18 20 56 50 90 60 40である 。1 0 40 20 18 30 60 50 56 90である 1,820,304,050,566,090 1,830,205,650,906,040 18 20 30であります40 50 56 60 90である 4,020,601,830,509,056 4,060,905,056,203,018 9,060,565,040,302,018 9,056,506,030,182,040 4,020,183,060,505,690 18 20 30 40 50であります56は、60〜90である 18 20 56 50 90 60 30 40である 。4 。4
//次のコードはACであります
書式#include <stdio.hに>
する#include <stdlib.h>に含まれ
ます。#define OK 1つ
の#define ERROR 0
の#define MAXSIZE 100
のtypedef int型TElemType。
typedef int型のステータス。
typedefは構造体B木
{
TElemTypeデータ。
B木構造体* lchild、* rchild。
} BTNODE、* BTpoint。
構造体スタックのtypedef
{
BTpoint *ベース、*トップ。
int型のスタックサイズ。
}スタック;
typedefは構造体quence
{
BTpoint *フロント、リア*。
int型のquencesize。
} Quence。
ステータスCreat_stack(スタック&S)
{
リターンエラーであれば((S.base =(BTpoint *)はmalloc(MAXSIZE *はsizeof(BTpoint)))!)。
S.top = S.base。
S.stacksize = MAXSIZE。
OKを返します。
}
ステータスCreat_quence(Quence&Q)
{
IF(!(Q.front =(BTpoint *)はmalloc(MAXSIZE *はsizeof(BTpoint))))リターンエラー。
Q.rear = Q.front。
Q.quencesize = MAXSIZE。
OKを返します。
}
ステータスCreat_and_insert(BTpoint&T、TElemType x)から
{
IF(T == NULL)
{
IF(!(T =(BTpoint)はmalloc(はsizeof(BTNODE))))リターンエラー。
他
{
T->データ= xと;
T-> lchild = T-> rchild = NULL;
}
}
他
{
IF(X <T->データ)
Creat_and_insert返す(T-> lchildを、X)。
他のCreat_and_insert(T-> rchild、x)を返します。
}
OKを返します。
}
ステータスPrint_tree_data(TElemType電子)
{
のprintf( "%dの"、E)。
OKを返します。
}
ステータスFirt_view_root(BTpoint T、ステータス(*ビュー)(TElemType E))//先序遍历
{
IF(T!= NULL)
{
IF(Print_tree_data(T->データ))
IF(Firt_view_root(T-> lchild、ビュー))
(Firt_view_root(T-> rchild、ビュー))戻りOKであれば、
ERRORを返します。
}
他に戻りOK。
}
ステータスMid_view_root(BTpoint T、ステータス(*ビュー)(TElemType E))//中序遍历
{
IF(T!= NULL)
{
IF(Mid_view_root(T-> lchild、ビュー))
(Print_tree_data(T->もしデータ))
(Mid_view_root(T->もしrchild、ビュー))戻りOK。
ERRORを返します。
}
他に戻りOK。
}
ステータスLast_view_root(BTpoint T、ステータス(*ビュー)(TElemType E))//后序遍历
{
IF(T!= NULL)
{
IF(Last_view_root(T-> lchild、ビュー))
(Last_view_root(T->もしrchild、ビュー))
IF(Print_tree_data(T->データ))戻りOK。
ERRORを返します。
}
他に戻りOK。
}
ステータスFind_data(BTpoint T、TElemTypeのfindit)//查找
{
IF(!T = NULL)
{
IF(findit == T->データ)のリターン1。
それ以外の場合(findit <T->データ)(findit、T-> lchild)Find_dataを返します。
他Find_data(T-> rchild、findit)を返します。
}
それ以外の戻り0;
}
ボイドviewall(BTpoint T、ステータス(*ビュー)(TElemType電子))
{
Firt_view_root(T、Print_tree_data)。
printf( "\ n")を。
Mid_view_root(T、Print_tree_data)。
printf( "\ n")を。
Last_view_root(T、Print_tree_data)。
printf( "\ n")を。
}
ステータスM_nonrecursive(BTpoint T、スタックS)//中序遍历序列(非递归算法)
{
ながら(T!= NULL || S.base!= S.top)
{
ながら(T!= NULL)
{
* S .top ++ = T。
T = T-> lchild。
}
T = * - S.top。
Print_tree_data(T->データ)。
T = T-> rchild。
}
OKを返します。
}
ステータスLevel_view(BTpoint T、Quence Q)//层次遍历
{
(T = NULL!)なら
、{
* Q.rear ++ = T。
しばらく(!Q.front = Q.rear)
{
場合(!T-> lchild = NULL)* Q.rear ++ = T-> lchild。
(もし!T-> rchild = NULL)* Q.rear ++ = T-> rchild。
T = * Q.front ++;
printf( "%dの"、T->データ)。
T = * Q.front。
}
}
OKを返します。
}
状態swap_tree(BTpoint&T)
{
BTpointの一時。
IF(!T = NULL)
{
TEMP = T-> lchild。
T-> lchild = T-> rchild。
T-> rchild =温度;
swap_tree(T-> lchild);
swap_tree(T-> rchild);
}
OKを返します。
}
状態tree_deep(BTpoint T)//求二叉树深度
{
int型のLD = 0、RD = 0。
T(もし!
、LD = tree_deep(T-> lchild);
RD = tree_deep(T-> rchild);
}
そうでなければ0を返し、
戻りLD> LD + RD 1:?RD + 1;
}
ステータスleaf_number(BTpoint T、INT&NUM)//総葉シーク
{
IF(T)
{
IF(T-> == NULL && T-rchild> lchild == NULL)NUM ++;
他
{
leaf_number(T-> lchild、NUM);
leaf_number(T-> rchild、NUM) ;
}
}
OKを返す;
}
int型のmain()
{
BTpoint BT = NULL;
スタックS;
Quence Q;
INT N-、I、fnb1、fnb2、isnb;
int型NUM = 0、ディープ、
INT A [MAXSIZE];
scanfの( " %のD」、&N); // 最初の行:入力ノードの数が寄与nを準備
のための(I = 0、I <N - ;スペースで区切られた入力nは整数:i)は// 2行目++します
{
scanfの( "%のD"、&A [I]);
Creat_and_insert(BT、A [I])。
}
のscanf( "%d個"、&fnb1); //第三列:検索対象となる入力されたキーワード
のscanf( "%d個"、& fnb2を); // 第4行:検索対象となる入力されたキーワード
のscanf(「%dの」&isnb); // 5行目:挿入するキーワード入力
viewall(BT、Print_tree_data)を;
のprintf( "N- \%のD"、Find_data(BT、fnb1));
のprintf( "N- \%のD"、Find_data (BT、fnb2));
//挿入し、挿入後
Creat_and_insert(BT、isnb);
viewall(BT、Print_tree_data);
//出力ライン9及び10
Creat_stack(S);
M_nonrecursive(BT、S);
のprintf ( "N-を\");
Creat_quence(Q);
Level_view(BT、Qは);
のprintf( "N-を\");
//最初の交換
swap_tree(BT)。
OK // 11〜13:配列先行順でそれぞれ左右の後サブツリーの第一の交換ノード、
viewall(BT、Print_tree_data);
//第二の交差
swap_tree(BT);
// 14から16:ライン二次、左及び右サブツリー後の各交換ノードの前、間および後シーケンスプレオーダー
viewall(BT、Print_tree_data);
//ライン17、二分木の深さ
深い= tree_deep(BT);
のprintf(「%D \ N- 」深い);
OK // 18、リーフノードの総数
leaf_number(BT、NUM);
のprintf( "%d個の\ N-"、NUM);
戻り0;
}
ます。https://www.cnblogs.com/arcfat/archive/2012/10/20/2732150.htmlで再現