高度な実験4から3.3の完全なバイナリ検索ツリー(30ポイント)

 

 問題解決のアイデア:

図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、sizeofint型)、CMP); 
    BiTree T = BuildTree(0、N- 1 )。
    OUT(T)。
}

 

おすすめ

転載: www.cnblogs.com/snzhong/p/12455764.html