最初に挿入された一連の数字を考えるとAVL木、あなたの出力値最後の世代のAVL木のルートを空にします。
入力フォーマット:
入力の最初の行は、正の整数で与えられるN(与えラインに続くを≤)、Nに隙間によって分離された異なる整数を、。
出力フォーマット:
行は、最初は空AVLツリーは、ツリーのルートの値に整数の出力順に挿入された後。
サンプル入力1:
5
88 70 61 96 120
出力サンプル1:
70
サンプル入力2:
7
88 70 61 96 120 90 65
出力サンプル2:
88
調整プロセスAVL木の主なテスト。
コード:
書式#include <stdio.hに> する#include <stdlib.h>に含ま typedefは構造体ノードノード。 構造体ノード{ int型データ。 構造体のノード*左、* 右; } *ヘッド= NULL; ノード *新しい(INT D){ ノード * =ノード(ノード*)はmalloc(はsizeof (ノード))。 ノード - >データ= D。 ノード - >左=ノード- >右= NULL; リターン・ノード; } ノード * LL(ノード* ノード){ ノード L * =ノード- >左; ノード - >左= L - > 右。 L - >右= ノード。 リターンリットル。 } ノード * RR(ノード* ノード){ ノード * R =ノード- > 右。 ノード - >右= R - > 左。 R - >左= ノード。 戻りR; } ノード * LR(ノード* ノード){ ノード - >左= RR(ノード- > 左)。 戻りLL(ノード)。 } ノード * RL(ノード* ノード){ ノード - >右= 11(ノード- >右); リターンRR(ノード)。 } int型の最大値(int型、int型b)は{ 返す > bは?:B; } int型の高さ(ノード* ノード){ 戻りノード== NULL?0:MAX(身長(ノード- >左)、高さ(ノード- >右))+ 1 。 } ノード *インサート(ノード*ノード、int型のD){ 場合(ノード== NULL){ ノード = 新しい(D)。 } そう であれば(D <ノード- > データ){ ノード- >左=インサート(ノード- > 左、D)。 } 他{ ノード - >右=インサート(ノード- > 右、D)。 } であれば(高さ(ノード- >左) -高さ(ノード- >右)== 2 ){ 場合(D <ノード- >左- > データ){ ノード = LL(ノード)。 } 他{ ノード = LR(ノード)。 } } そう であれば(高さ(ノード- >左) -高さ(ノード- >右)== - 2 ){ 場合(D>ノード- >右- > データ){ ノード = RR(ノード)。 } 他{ ノード = RL(ノード)。 } } 戻りノード。 } int型のmain(){ int型N、D。 scanf関数(" %のD "、&N) 以下のために(INT iが= 0、I <N; I ++ ){ scanf関数(" %のD "、&D)。 ヘッド = インサート(ヘッド、D)。 } のprintf(" %dの"、頭- > データ)。 リターン 0 ; }