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

来源:互联网 发布:淘宝申请售后时间期限 编辑:程序博客网 时间:2024/06/02 00:19

题目描述

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

输入

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

输出

输出平衡二叉树的树根。

示例输入

588 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);
}


0 0
原创粉丝点击