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


     

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

    Time Limit: 400 ms Memory Limit: 65536 KiB

    Problem Description

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

    Input

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

    Output

    输出平衡二叉树的树根。

    Sample Input

    5
    88 70 61 96 120

    Sample Output

    70

    提示:本题考查平衡二叉树的特点:树的左子树和右子树的高度差不超过1,所以要通过不断移动结点来使二叉树平衡。

    代码实现如下(g++):
    #include <stdio.h>
    #include <stdlib.h>
    
    typedef struct node
    {
        int data,dp;
        struct node *l,*r;
    }node;
    
    int max(int x,int y)//找最大值
    {
        if(x>y)
        {
            return x;
        }
        else
        {
            return y;
        }
    }
    int deep(node *t)//求树高
    {
        if(t==NULL)
        {
            return -1;
        }
        else
        {
            return t->dp;
        }
    }
    node *LL(node *t)//LL型变换
    {
        node *p;
        p=t->l;//p是t的左子树
        t->l=p->r;//p的右子树连上t的左子树
        p->r=t;//p的右子树连上t
        p->dp=max(deep(p->l),t->dp)+1;//求树的深度
        t->dp=max(deep(t->l),deep(t->r))+1;
        return p;
    }
    node *RR(node *t)//RR型变换
    {
        node *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;
    }
    node *RL(node *t)//RL型变换
    {
        t->r=LL(t->r);//将其变成RR型
        return RR(t);
    }
    node *LR(node *t)//LR型变换
    {
        t->l=RR(t->l);
        return LL(t);
    };
    node *create(node *t,int x)
    {
        if(t==NULL)
        {
            t=(node *)malloc(sizeof(node));
            t->l=NULL;
            t->r=NULL;
            t->data=x;//树根起始为x
            t->dp=0;//树深为0
        }
        else if(x<t->data)//重新找树根
        {
            t->l=create(t->l,x);
            if(deep(t->l)-deep(t->r)>1)
            {
                if(x<t->l->data)
                {
                    t=LL(t);
                }
                else
                {
                    t=LR(t);
                }
            }
        }
        else if(x>t->data)//重新找树根
        {
            t->r=create(t->r,x);
            if(deep(t->r)-deep(t->l)>1)
            {
                if(x>t->r->data)
                {
                    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);
        node *h=NULL;
        for(i=1;n>=i;i++)
        {
            scanf("%d",&x);
            h=create(h,x);
        }
        printf("%d\n",h->data);
        return 0;
    }
    
    
    
    /***************************************************
    Result: Accepted
    Take time: 0ms
    Take Memory: 152KB
    ****************************************************/
  • 相关阅读:
    websocket以及它的内部原理
    服务端向客户端推送消息的几种方式,基于ajax,队列以及异常处理实现简易版本的群聊功能(长轮询)
    分布式爬虫以及语言介绍
    去重以及布隆过滤器
    下载中间件,selenium集成
    【商城应用】商品运费流程设计
    引用本地jar包记得加扫描路径(注意重复bean)
    乐观锁悲观锁场景
    Linux时区
    JsonObject常用转换
  • 原文地址:https://www.cnblogs.com/syycjh/p/9511624.html
Copyright © 2020-2023  润新知