4.2運動平衡二分木のルート(25点)

最初に挿入された一連の数字を考えるとAVL木、あなたの出力値最後の世代のAVL木のルートを空にします。

入力フォーマット:

入力の最初の行は、整数正与えられるN(行が続くが、≦20)、得られる隙間によって分離されたN個の異なる整数を、。

出力フォーマット:

行は、最初は空AVLツリーは、ツリーのルートの値に整数の出力順に挿入された後。

サンプル入力1:

5
88 70 61 96 120
 

出力サンプル1:

70
 

サンプル入力2:

7
88 70 61 96 120 90 65 
 

出力サンプル2:

88

解決のアイデア:バイナリ・ソートツリーが同時に平衡二分木で生成し、調整
のケースを調整する必要があります:
1は、単一スピンを残しました

 

2、右回転のみ

 

 

 3、最初の右利き左利き後

 

 

 図4に示すように、第一左利き、右利きの後

 

 

 

する#include <stdio.hに> 
する#include < malloc関数 .H>
 の#define ElemType INT 
のtypedef 構造体BiTNode { 
    ElemTypeデータ。
    ストラクト BiTNode * 左;
    ストラクト BiTNode * 右を。
} * AVLTree。
AVLTree SingleLeftRotation(AVLTree T){//左单旋
    AVLTree B = T-> 左。
    T - >左= B-> 右; 
    B - >右= T;
    リターンB; 
} 
AVLTree SingleRightRotation(AVLTree T){//右单旋
    AVLTree B = T-> 右。
    T- > = B右> 左; 
    B - >左= T;
     戻りB; 
} 
AVLTree DoubleLeftRightRotation(AVLTree T){//両手利き約
    T - >左= SingleRightRotation(T-> 左);
     戻りSingleLeftRotation(T) ; 
} 
AVLTree DoubleRightLeftRotation(AVLTree T){//両手利き左右の
    T - > =右SingleLeftRotation(T-> 右);
     戻りSingleRightRotation(T); 
} 

AVLTreeインサート(AVLTree T、X-elemType){ 
    IF(!T){ 
        T =(AVLTree)はmallocはsizeof (AVLTree)); //新しいノードが空間に挿入されるたびに適用する
        T- >データ= X; 
        T - >左= NULL; 
        T - >右= NULL; 
    } {
         場合(X> T-> データ){//往右子树找位置
            T - >右=挿入(T-> 右、X)。
            もし(のgetHeight(T->右)-GetHeight(T->左)== 2 ){
                 場合(X <T->右- > データ){ 
                    T = DoubleRightLeftRotation(T)。
                } そうでなければ T = SingleRightRotation(T)。
            } 
        } それ以外 の場合(X <T->データ){//往左子树找位置
            T - >左=挿入(T-> 左、X)。
            もし(のgetHeight(T->左)-GetHeight(T->右)== 2 ){
                 場合(X> T->左目> データ){ 
                    T = DoubleLeftRightRotation(T)。
                } そうでなければ T = SingleLeftRotation(T)。
            } 
        } 
    } 
    戻りTを。

} 
int型のgetHeight(AVLTree T){//求树高
     場合(!T)
         戻り 0 ;
    INT HL =のgetHeight(T-> 左)。
    int型時間=のgetHeight(T-> 右)。
    リターン(HL>時間HL:時間?)+ 1 ; 
} 
int型のmain(){
     int型のn、X、I。
    scanf関数(" %のD "、&N)
    AVLTree T = NULL; //初始化为NULL;
    以下のために(私は= 0 ; iが<N; I ++ ){ 
        scanf関数(" %のD "、&x)は、
        T = インサート(T、X)。
    } 
    のprintf(" %d個"、T-> データ)。
    リターン 0 ; 
}

 

おすすめ

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