(模板题)sdut 3374 数据结构实验之查找二:平衡二叉树(平衡二叉树的建立)

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

Time Limit: 400ms   Memory limit: 65536K  有疑问?点这里^_^

题目描述

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

输入

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

输出

输出平衡二叉树的树根。

示例输入

5
88 70 61 96 120

示例输出

70

提示

只是在二叉排序树上增加了深度判断和树的旋转,模板来源→
戳进来(仅仅只是改了变量名)
树的旋转。(这里面的LR形和RL形对应我的代码似乎是相反的) 这题数据竟然加强了(RE),后面对代码进行了修改。

来源

xam 

示例程序

#include <stdio.h>
#include <stdlib.h>
struct tree
{
    int d,dp;
    struct tree *l,*r;
};
int max(int x,int y)
{
    if(x>y)
    {
        return x;
    }
    else
    {
        return y;
    }
}
int deep(struct tree *t)
{
    if(t==NULL)
    {
        return -1;
    }
    else
    {
        return t->dp;
    }
}
struct tree *LL(struct tree *t)
{
    struct tree *p;
    p=t->l;
    t->l=p->r;
    p->r=t;p->dp=max(deep(p->l),t->dp)+1;
    t->dp=max(deep(t->l),deep(t->r))+1;
    return p;
}
struct tree *RR(struct tree *t)
{
    struct tree *p;
    p=t->r;
    t->r=p->l;
    p->l=t;p->dp=max(deep(p->r),t->dp)+1;
    t->dp=max(deep(t->l),deep(t->r))+1;
    return p;
}
struct tree *RL(struct tree *t)
{
    t->r=LL(t->r);
    return RR(t);
}
struct tree *LR(struct tree *t)
{
    t->l=RR(t->l);
    return LL(t);
};
struct tree *create(struct tree *t,int x)
{
    if(t==NULL)
    {
        t=(struct tree *)malloc(sizeof(struct tree));
        t->l=NULL;
        t->r=NULL;
        t->d=x;
        t->dp=0;
    }
    else if(x<t->d)
    {
        t->l=create(t->l,x);
        if(deep(t->l)-deep(t->r)>1)
        {
            if(x<t->l->d)
            {
                t=LL(t);
            }
            else
            {
                t=LR(t);
            }
        }
    }
    else if(x>t->d)
    {
        t->r=create(t->r,x);
        if(deep(t->r)-deep(t->l)>1)
        {
            if(x>t->r->d)
            {
                t=RR(t);
            }
            else
            {
                t=RL(t);
            }
        }
    }
    t->dp=max(deep(t->l),deep(t->r))+1;
    return t;
}
int main()
{
    int n,i,x;
    scanf("%d",&n);
    struct tree *h=NULL;
    for(i=1;n>=i;i++)
    {
        scanf("%d",&x);
        h=create(h,x);
    }
    printf("%d",h->d);
    return 0;
}
 



/**************************************
	Problem id	: SDUT OJ 3374 
	Code Len	: 1924B	
	Result		: Accepted 
	Take Memory	: 300K 
	Take Time	: 0MS 
	Submit Time	: 2016-08-27 19:52:37  
**************************************/
    原文作者:二叉查找树
    原文地址: https://blog.csdn.net/a15110103117/article/details/52013876
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞