数据结构实验之查找二:平衡二叉树

来源:互联网 发布:linux yum安装jdk1.7 编辑:程序博客网 时间:2024/06/08 02:43

数据结构实验之查找二:平衡二叉树

Time Limit: 400MS Memory Limit: 65536KB

Problem Description
根据给定的输入序列建立一棵平衡二叉树,求出建立的平衡二叉树的树根。

Input
输入一组测试数据。数据的第1行给出一个正整数N(n <= 20),N表示输入序列的元素个数;第2行给出N个正整数,按数据给定顺序建立平衡二叉树。

Output
输出平衡二叉树的树根。

Example Input
5
88 70 61 96 120

Example Output
70

#include <bits/stdc++.h>using namespace std;typedef struct node{    int data;    int height;    struct node *lchild, *rchild;}BiTNode, *BiTree;int maxh(int a, int b){    return a > b? a : b;}int height(BiTree T){    if(T == NULL)        return 0;    else        return T -> height;}BiTNode *Left(BiTree T)  //LL型{    BiTree T2;    T2 = T -> lchild;    T -> lchild = T2 -> rchild;    T2 -> rchild = T;    T -> height = maxh(height(T -> lchild),height(T -> rchild)) +1;    T2 -> height = maxh(height(T2 -> lchild),height(T2 -> rchild)) +1;    return T2;}BiTNode *Right(BiTree T)   //RR型{    BiTree T2;    T2 = T -> rchild;    T -> rchild = T2 -> lchild;    T2 -> lchild = T;    T -> height = maxh(height(T -> lchild),height(T -> rchild)) +1;    T2 -> height = maxh(height(T2 -> lchild),height(T2 -> rchild)) +1;    return T2;}BiTNode *LeftRight(BiTree T)  //LR型{    T -> lchild = Right(T -> lchild);    return Left(T);}BiTNode *RightLeft(BiTree T)  //RL型{    T -> rchild = Left(T -> rchild);    return Right(T);}void add(BiTree &T, int n)  //构建平衡二叉树{    if(T == NULL)    {        T = (BiTNode *)malloc(sizeof(BiTNode));        T -> data = n;        T -> height = 1;        T -> lchild = T -> rchild = NULL;    }    else if(n < T -> data)    {        add(T -> lchild, n);        //平衡二叉树左右子树深度差不超过2        int balance = height(T -> rchild) - height(T -> lchild);        if(balance >= 2 || balance <= -2)  //判断二叉树是否平衡        {            if(n < T -> lchild -> data)               T =  Left(T);            else               T =  LeftRight(T);        }    }    else if(n > T -> data)    {        add(T -> rchild, n);        int balance = height(T -> rchild) - height(T -> lchild);        if(balance >= 2 || balance <= -2)        {            if(n > T -> rchild -> data)               T =  Right(T);            else                T = RightLeft(T);        }    }    T -> height = maxh(height(T -> lchild),height(T -> rchild)) +1;  }int main(){    int n, x;    BiTree T;    T = NULL;    cin >> n;    while(n--)    {        cin >> x;        add(T,x);    }    cout << T -> data << endl;    return 0;}
原创粉丝点击