問題解決のアイデア:
図1に示すように、入力データの昇順に、非減少のソートツリートラバーサル順序の特性を使用して
2、完全二分木の特性を使用して、左の部分木の数を見つけ、ルートノードは、バイナリ検索ツリーを確立する、位置、左再帰的ルートノードを決定右サブツリーを決定します
3、出力層の前順
する#include <stdio.hに> する#include <math.h>の 書式#include <malloc.hを> の#define ElemType INT のtypedef 構造体TNODE { ElemTypeデータ。 構造体 TNODE *左、* 右; } * BiTree。 INT CMP(INT *、INT * B){ リターン * A- * B。 } INT FindRootで(INT A []、INT低い、INTの高い){ int型のカウント; 場合(低== 高い){ カウント =0 ; } 他{ int型のlen =ハイ+ 1 - 低いです。 int型 H =ログ(LEN)/ログ(2 )。 INT leftnum = LEN-POW(2、H)+ 1 。 もし(leftnum> POW(2、H)/ 2 ) leftnum = POW(2、H)/ 2 。 カウント =(POW(2、H) - 2)/ 2 + leftnum。 } リターン回数、 } BiTree BuildTree(INT []、int型低、INTの高い){ int型 POS =低+ FindRootで(低、高)。 BiTree T =(BiTree)はmalloc(はsizeof (BiTree))。 T - >データ= [POS]。 int型 llen = POS- 低いです。 int型 RLEN =高POS; もし(llen){ T - >左= BuildTree(低、POS- 1 )。 } 他の T - >左= NULL; もし(RLEN){ T - >右= BuildTree(POS + 1 、高)。 }他の T - >右= NULL; 返すTを。 } int型フラグ= 0 。 ボイドアウト(BiTree T){ BiTree Q [ 100 ]。 INTの正面= 0 =後、0 。 Q [フロント ++] = T。 一方(後< フロント){ BiTree P = Q [後部++ ]。 もし(フラグ) のprintf(" " )。 そうでなければ フラグ = 1 。 printf("%のD "、P-> データ) であれば(P-> 左) Q [フロント ++] = P-> 左; もし(P-> 右) Q [フロント ++] = P-> 右; } } INT のmain(){ int型のn; scanf関数(" %のD "、&n)は、 INT iが、 INT [N]; のための(iは= 0 ; I <N I ++ ){ scanf関数(" %のD "、&[ I]); } のqsort(、N、sizeof(int型)、CMP); BiTree T = BuildTree(0、N- 1 )。 OUT(T)。 }