最初に挿入された一連の数字を考えると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 ; }