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('\n');
118     xout(root);
119     putchar('\n');
120     mout(root);
121     */
122     printf("%d\n",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 ****************************************************/

 

posted @ 2016-11-29 16:33  Leroscox  阅读(554)  评论(0编辑  收藏  举报