您的位置:首页 > 理论基础 > 数据结构算法

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

2016-08-22 17:09 393 查看


题目描述

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


输入

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


输出

输出平衡二叉树的树根。


示例输入

5
88 70 61 96 120



示例输出

70

/*#include<stdio.h>

#include<stdlib.h>

#include<string.h>

#include<algorithm>

using namespace std;

typedef struct BNode

{

    int data;

    int d;//记录树的深度;

    BNode *lchild,*rchild;

}*BiTree;

int deep(BiTree &T)

{

    if(!T)

    return 0;

    return T->d;

}

BiTree LL(BiTree &T)//向右旋型

{

    BiTree p;

    p=T->lchild;

    T->lchild=p->rchild;

    p->rchild=T;

    p->d=max(deep(p->lchild),deep(p->rchild))+1;

    T->d=max(deep(T->lchild),deep(T->rchild))+1;

    return p;

}

BiTree RR(BiTree &T)//向左型旋;

{

    BiTree p;

    p=T->rchild;

    T->rchild=p->lchild;

    p->lchild=T;

    p->d=max(deep(p->lchild),deep(p->rchild))+1;

    T->d=max(deep(T->lchild),deep(T->rchild))+1;

    return p;

}

BiTree LR(BiTree &T)//旋转分两步:1.以a为根结点的RR旋转 2.以x为根结点的LL旋转

{

    T->lchild=RR(T->lchild);

    return LL(T);

}

BiTree RL(BiTree &T)//旋转分两步:1.以a为根结点的LL旋转 2.以x为根结点的RR旋转

{

    T->rchild=LL(T->rchild);

    return RR(T);

}

BiTree Insert(BiTree &T,int n)

{

    if(!T)

    {

        T=new BNode;

        T->lchild=T->rchild=NULL;

        T->data=n;

        T->d=1;

    }

    else if(n<T->data)

    {

        T->lchild=Insert(T->lchild,n);

        if(deep(T->lchild)-deep(T->rchild)>1)

        {

            if(n<T->lchild->data)

                T=LL(T);

            else

                T=LR(T);

        }

    }

    else if(n>T->data)

    {

        T->rchild=Insert(T->rchild,n);

        if(deep(T->rchild)-deep(T->lchild)>1)

        {

            if(n>T->rchild->data)

                T=RR(T);

            else

                T=RL(T);

        }

    }

    T->d=max(deep(T->lchild),deep(T->rchild))+1;

    return T;

}

int main()

{

   int n,num;

   scanf("%d",&n);

   BiTree T;

   T=NULL;//树的初始化。

   for(int i=0;i<n;i++)

   {

       scanf("%d",&num);

       Insert(T,num);

   }

   printf("%d\n",T->data);

    return 0;

}*/

#include<stdio.h>

#include<stdlib.h>

#include<string.h>

#include<algorithm>//max函数在此头文件中;

using namespace std;

typedef struct BNode

{

    int data;

    int d;

    BNode *lchild,*rchild;

}*BiTree;

int n;

int deep(BiTree T)

{

    if(!T)

    return -1;

    return T->d;

}

BiTree LL(BiTree &T)

{

    BiTree p;

    p=T->lchild;

    T->lchild=p->rchild;

    p->rchild=T;

    p->d=max(deep(p->lchild),deep(p->rchild))+1;

    T->d=max(deep(T->lchild),deep(T->rchild))+1;

    return p;

}

BiTree RR(BiTree &T)

{

    BiTree p;

    p=T->rchild;

    T->rchild=p->lchild;

    p->lchild=T;

    p->d=max(deep(p->rchild),deep(p->lchild))+1;

    T->d=max(deep(T->rchild),deep(T->lchild))+1;

    return p;

}

BiTree LR(BiTree &T)

{

    T->lchild=RR(T->lchild);

    return LL(T);

}

BiTree RL(BiTree &T)

{

    T->rchild=LL(T->rchild);

    return RR(T);

}

BiTree Insert(BiTree &T,int x)

{

    if(!T)

    {

        T=new BNode;

        T->lchild=T->rchild=NULL;

        T->data=x;

        T->d=0;

    }

    else if(x<T->data)

    {

        Insert(T->lchild,x);

        if(deep(T->lchild)-deep(T->rchild)>1)

        {

            if(x<T->lchild->data)

                T=LL(T);

            else

                T=LR(T);

        }

    }

    else if(x>=T->data)

    {

        Insert(T->rchild,x);

        if(deep(T->rchild)-deep(T->lchild)>1)

            {

                if(x>T->rchild->data)

                   T=RR(T);

                else

                   T=RL(T);

            }

    }

    T->d=max(deep(T->rchild),deep(T->lchild))+1;

    return T;

}

int main()

{

    scanf("%d",&n);

    int num;

    BiTree T;

    T=NULL;

    for(int i=1;i<=n;i++)

    {

        scanf("%d",&num);

       T=Insert(T,num);

    }

    printf("%d\n",T->data);

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: