バイナリ・ソートツリーを達成するために種々のアルゴリズム

オリジナルリンク: http://www.cnblogs.com/arcfat/archive/2012/10/20/2732150.html

バイナリ・ソートツリーを達成するために、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で再現

おすすめ

転載: blog.csdn.net/weixin_30402085/article/details/94789590