PAT Root of AVL Tree (25)

题目简介:

给出一个正整数n,然后给出n个不同的整数。将这n个数按照输入顺序构成一颗平衡二叉树,然后输出平衡二叉树根节点的值

解题思路:

按照输入顺序简历平衡二叉树,输出结果

代码:

  1 #include<iostream>
  2 using namespace std;
  3 #define N 2500
  4 #define EH 0
  5 #define LH 1
  6 #define RH -1
  7 struct Node
  8 {
  9 public:
 10     static int used;
 11     int key;
 12     int bf;
 13     Node* left,*right;
 14     Node():left(NULL),right(NULL),bf(EH){}
 15 }ns[N];
 16 int Node::used=0;
 17 typedef Node* Tree;
 18 void leftRotate(Tree &p)
 19 {
 20     Tree rc=p->right;
 21     p->right=rc->left;
 22     rc->left=p;
 23     p=rc;
 24 }
 25 void rightRotate(Tree& p)
 26 {
 27     Tree lc=p->left;
 28     p->left=lc->right;
 29     lc->right=p;
 30     p=lc;
 31 }
 32 void leftBalance(Tree& tree)
 33 {
 34     Tree b=tree->left;
 35     if(b->bf==LH)
 36     {
 37         b->bf=tree->bf=EH;
 38         rightRotate(tree);
 39     }else if(b->bf==RH)
 40     {
 41         Tree c=b->right;
 42         switch(c->bf)
 43         {
 44         case LH:
 45             tree->bf=RH;
 46             b->bf=EH;
 47             break;
 48         case EH:
 49             tree->bf=b->bf=EH;
 50             break;
 51         case RH:
 52             tree->bf=EH;
 53             b->bf=LH;
 54             break;
 55         }
 56         c->bf=EH;
 57         leftRotate(tree->left);
 58         rightRotate(tree);
 59     }
 60 }
 61 void rightBalance(Tree& tree)
 62 {
 63     Tree b=tree->right;
 64     if(b->bf==RH)
 65     {
 66         b->bf=EH;
 67         tree->bf=EH;
 68         leftRotate(tree);
 69     }else if(b->bf==LH)
 70     {
 71         Tree c=b->left;
 72         switch(c->bf)
 73         {
 74         case LH:
 75             tree->bf=EH;
 76             b->bf=RH;
 77             break;
 78         case EH:
 79             tree->bf=b->bf=EH;
 80             break;
 81         case RH:
 82             tree->bf=LH;
 83             b->bf=EH;
 84             break;
 85         }
 86         c->bf=EH;
 87         rightRotate(tree->right);
 88         leftRotate(tree);
 89     }
 90 }
 91 bool insert(Tree& tree,int num,bool& taller)
 92 {
 93     if(tree==NULL)
 94     {
 95         tree=&ns[Node::used++];
 96         tree->key=num;
 97         taller=true;
 98         return true;
 99     }
100     if(tree->key==num)
101     {
102         taller=false;
103         return false;
104     }
105     if(num<tree->key)
106     {
107         if(insert(tree->left,num,taller))
108         {
109             if(taller)
110             {
111                 switch(tree->bf)
112                 {
113                 case LH:
114                     leftBalance(tree);
115                     taller=false;
116                     break;
117                 case EH:
118                     tree->bf=LH;
119                     taller=true;
120                     break;
121                 case RH:
122                     tree->bf=EH;
123                     taller=false;
124                     break;
125                 }
126             }
127             return true;
128         }
129         else
130         {
131             return false;
132         }
133     }else
134     {
135         if(insert(tree->right,num,taller))
136         {
137             if(taller)
138             {
139                 switch(tree->bf)
140                 {
141                 case LH:
142                     tree->bf=EH;
143                     taller=false;
144                     break;
145                 case EH:
146                     tree->bf=RH;
147                     taller=true;
148                     break;
149                 case RH:
150                     rightBalance(tree);
151                     taller=false;
152                     break;
153                 }
154             }
155             return true;
156         }
157         else
158         {
159             return false;
160         }
161     }
162 }
163 int main()
164 {
165     //freopen("in.txt","r",stdin);
166     //freopen("out.txt","w",stdout);
167     int n;
168     int num;
169     scanf("%d",&n);
170     int i;
171     Tree tree=NULL;
172     bool taller;
173     for(i=0;i<n;i++)
174     {
175         scanf("%d",&num);
176         taller=false;
177         insert(tree,num,taller);
178     }
179     printf("%d\n",tree->key);
180     return 0;
181 }

 

posted @ 2016-11-09 12:35  冠king  阅读(84)  评论(0)    收藏  举报