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

来源:互联网 发布:天下三男鬼墨捏脸数据 编辑:程序博客网 时间:2024/06/10 01:53

Problem Description

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

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

输出平衡二叉树的树根。
Example Input

5
88 70 61 96 120
Example Output

70

#include <iostream>using namespace std;typedef struct node{    int data;    struct node *l, *r;    int d;}Binode, *Bitree;int depth(Bitree T){    if(!T)//空树        return -1;    else        return T->d;//每插入一个节点,就要更新此节点上层所有节点的深度}int max(int x, int y){    return x > y ? x : y;}Bitree LL(Bitree T){    Bitree p = T->l;//P节点为B节点    T->l = p->r;    p->r = T;    T->d = max(depth(T->l), depth(T->r)) + 1;    p->d = max(depth(p->l), depth(p->r)) + 1;    return p;}Bitree RR(Bitree T){    Bitree p = T->r;    T->r = p->l;    p->l = T;    T->d = max(depth(T->l), depth(T->r)) + 1;    p->d = max(depth(p->l), depth(p->r)) + 1;    return p;}Bitree LR(Bitree T){    T->l = RR(T->l);    T = LL(T);    return T;}Bitree RL(Bitree T){    T->r = LL(T->r);    T = RR(T);    return T;}void creat(Bitree &T, int x){    if(!T)    {        T = new Binode;        T->data = x;        T->l = T->r = NULL;        T->d = 0;    }    else    {        if(x < T->data)//左        {            creat(T->l, x);            if(depth(T->l) - depth(T->r) > 1)//如果新插入节点导致A节点不平衡,则根据情况旋转            {                if(x < T->l->data)//左                {                    T = LL(T);                }                else//右                    T = LR(T);            }        }        else if(x > T->data)//右        {            creat(T->r, x);            if(depth(T->r) - depth(T->l) > 1)            {                if(x < T->r->data)//左                    T = RL(T);                else//右                    T = RR(T);            }        }    }   T->d = max(depth(T->l), depth(T->r)) + 1;//新插入一个节点后,来更新节点的深度}int main(){    int n, x;    cin>>n;    Bitree T;    T = NULL;//必须有    for(int i = 0; i < n; i++)    {        cin>>x;        creat(T, x);    }    cout<<T->data<<endl;    return 0;}
原创粉丝点击