AVL Tree

Description

给出结点的插入序列,构造AVL Tree。 

Input

第一行含一个整数t(0<t<10),为测试样例个数。
每个测试样例包含两行;第1行为一个整数n,表示插入的结点数;第2行依照插入顺序给出n个结点的数值(整数),之间用一个空格分隔。

Output

对每个测试样例单独一行输出对应AVL Tree的前序遍历序列,每输出一个结点的数值(包括最后一个结点),其后输出一个空格。 
 

Sample Input
2
5
1 2 3 5 4
16
3 2 1 4 5 6 7 16 15 14 13 12 11 10 8 9
Sample Output
2 1 4 3 5 
7 4 2 1 3 6 5 13 11 9 8 10 12 15 14 16

代码实现:
// Problem#: 19591
// Submission#: 4960420
// The source code is licensed under Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License
// URI: http://creativecommons.org/licenses/by-nc-sa/3.0/
// All Copyright reserved by Informatic Lab of Sun Yat-sen University
#include <iostream>
using namespace std;
#define DataType int
/*
定义AVL树的结构体,链式
*/
typedef struct AvlNode{
    DataType    data;
    AvlNode    * left;
    AvlNode    * right;
    int height;
}*AvlTree,AvlNode;

//求两个数的最大值
int Max(int a,int b) {
    return a>b?a:b;
}
//求树的高度
int Height( AvlTree T) {
    if(NULL == T)
        return -1;
    else
        return T->height;
}

//单旋转右旋
AvlTree singleRotateWithRight(AvlTree T) {
    AvlTree L = T->left;
    T->left = L->right;
    L->right = T;
    T->height = Max( Height(T->left),Height(T->right) ) + 1;
    L->height = Max( Height(L->left),Height(L->right) ) + 1;
    return L;
}
//单旋转左旋
AvlTree singleRotateWithLeft(AvlTree T) {
    AvlTree R = T->right;
    T->right = R->left;
    R->left = T;
    T->height = Max( Height(T->left),Height(T->right) ) + 1;
    R->height = Max( Height(R->left),Height(R->right) ) + 1;
    return R;
}
//双旋转,先左后右
AvlTree doubleRotateWithLeft(AvlTree T) {
    T->left = singleRotateWithLeft(T->left);
    return singleRotateWithRight(T);
}
//双旋转,先右后左
AvlTree doubleRotateWithRight(AvlTree T) {
    T->right = singleRotateWithRight(T->right);
    return singleRotateWithLeft(T);
}
AvlTree AvlTreeInsert(AvlTree T, DataType x) {
    if(T == NULL) {
        T = new AvlNode;
        if(T) {
            T->data = x;
            T->left    = NULL;
            T->right = NULL;
            T->height = 0;
        } else {
            exit(0);
        }
    }
    else if( x < T->data) {
        T->left = AvlTreeInsert(T->left,x);    //先插入,后旋转
        if(Height(T->left) - Height(T->right) == 2) {
            if(x < T->left->data) {
                T = singleRotateWithRight( T );
            } else {   //左右情况,双旋转,先左
                T = doubleRotateWithLeft( T );
            }
        }
    }
    else if( x > T->data ) {
        T->right = AvlTreeInsert(T->right,x);
        if(Height(T->right) - Height(T->left) == 2) {
            if(x > T->right->data) {  //右右情况,进行左旋
                T = singleRotateWithLeft( T );
            } else {
                T = doubleRotateWithRight( T );
            }
        }
    }
    //如果这个数已经存在,那么不进行插入
    T->height = Max(Height(T->left),Height(T->right)) + 1;
    return T;
}
//前序遍历
void PrevOrderVisitUseRecur(const AvlTree pCurrent) {
    if(pCurrent) {
        cout << pCurrent->data << " ";
        PrevOrderVisitUseRecur(pCurrent->left);
        PrevOrderVisitUseRecur(pCurrent->right);
    }
}
// 删除 
void clear(AvlTree root) {
    if (root == NULL) return;
    clear(root->left);
    clear(root->right);
    delete root;
}
int main() {
    int t, n, temp;
    AvlTree root = NULL;
    cin>> t;
    while (t--) {
        cin>> n;
        for (int i= 0; i< n; i++) {
            cin>> temp;
            root = AvlTreeInsert(root, temp);
        }
        PrevOrderVisitUseRecur(root);
        cout<< endl;
        clear(root);
        root = NULL;
    }
    return 0;
}                                 



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值