zoukankan      html  css  js  c++  java
  • SDUT 3374 数据结构实验之查找二:平衡二叉树

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

    Time Limit: 400MS Memory Limit: 65536KB

    Problem Description

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

    Input

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

    Output

    输出平衡二叉树的树根。

    Example Input

    5
    88 70 61 96 120

    Example Output

    70

    DQE:

    结点平衡因子改为该结点树深度,旋转操作记得更新结点深度。
     
      1 #include <iostream>
      2 #include <cstdio>
      3 using namespace std;
      4 /*
      5 全测数据
      6 in
      7 9
      8 16 3 7 11 9 26 18 14 15
      9 out
     10 11 7 3 9 18 15 14 16 26
     11 3 7 9 11 14 15 16 18 26
     12 */
     13 struct BT
     14 {
     15     int d;
     16     int x;
     17     BT *lt,*rt;
     18 };
     19 
     20 int dp(BT *r)
     21 {
     22     return r?r->d:0;
     23 }
     24 void rfd(BT *r)
     25 {
     26     int ld=dp(r->lt)+1,rd=dp(r->rt)+1;
     27     r->d=ld>rd?ld:rd;
     28 }
     29 
     30 void LL(BT *&r)
     31 {
     32 //    printf("LL#%d#%d*%d ",r->x,dp(r->lt),dp(r->rt));
     33     BT *a=r,*b=a->lt,*br=b->rt;
     34     r=b;    //利用引用修改上级指向
     35     b->rt=a;
     36     a->lt=br;
     37     //深度重定
     38     rfd(a);
     39 }
     40 void RR(BT *&r)
     41 {
     42 //    printf("RR#%d#%d*%d ",r->x,dp(r->rt),dp(r->lt));
     43     BT *a=r,*b=a->rt,*bl=b->lt;
     44     r=b;
     45     b->lt=a;
     46     a->rt=bl;
     47 
     48     rfd(a);
     49 }
     50 void LR(BT *&r)
     51 {
     52     RR(r->lt);
     53     rfd(r->lt);
     54     LL(r);
     55 }
     56 void RL(BT *&r)
     57 {
     58     LL(r->rt);
     59     rfd(r->rt);
     60     RR(r);
     61 }
     62 
     63 void insert(BT *&root,int e)
     64 {
     65     if(!root)
     66     {
     67         BT *r=new BT;
     68         r->x=e;
     69         r->d=1;
     70         r->lt=r->rt=NULL;
     71         root=r;
     72     }
     73     else
     74     {
     75         if(e<root->x)
     76         {
     77             insert(root->lt,e);
     78             if(dp(root->lt)-dp(root->rt)>1)
     79             {
     80                 if(e<root->lt->x)
     81                     LL(root);
     82                 else
     83                     LR(root);
     84             }
     85         }
     86         else if(e>root->x)
     87         {
     88             insert(root->rt,e);
     89             if(dp(root->rt)-dp(root->lt)>1)
     90             {
     91                 if(e>root->rt->x)
     92                     RR(root);
     93                 else
     94                     RL(root);
     95             }
     96         }
     97         //更新根深度
     98         rfd(root);
     99     }
    100 }
    101 
    102 void xout(BT *r)
    103 {if(r){printf("%d ",r->x);xout(r->lt);xout(r->rt);}}
    104 void mout(BT *r)
    105 {if(r){mout(r->lt);printf("%d ",r->x);mout(r->rt);}}
    106 int main()
    107 {
    108     BT *root=NULL;
    109     int n,i;
    110     scanf("%d",&n);
    111     while(n--)
    112     {
    113         scanf("%d",&i);
    114         insert(root,i);
    115     }
    116     /*
    117     putchar('
    ');
    118     xout(root);
    119     putchar('
    ');
    120     mout(root);
    121     */
    122     printf("%d
    ",root->x);
    123     return 0;
    124 }
    125 
    126 /***************************************************
    127 User name: ***
    128 Result: Accepted
    129 Take time: 0ms
    130 Take Memory: 156KB
    131 Submit time: 2016-11-29 19:09:25
    132 ****************************************************/
  • 相关阅读:
    解决WampServer窗口界面乱码问题
    PHP 中空字符串介绍0、null、empty和false之间的关系
    位(bit)、字节(byte)、字
    SQL GROUP BY 和 ORDER BY 区别
    爬虫安装相关软件
    nginx自动切割日志脚本
    tengine日志切割-配置分钟级别日志自动切割
    flutter进行自动编译操作步骤
    03-字符编码-读写模式-课堂笔记
    04-函数-课堂笔记
  • 原文地址:https://www.cnblogs.com/Leroscox/p/6114153.html
Copyright © 2011-2022 走看看