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 }

浙公网安备 33010602011771号