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 ****************************************************/
本文来自:[ https://www.cnblogs.com/Leroscox ]
博主:[ MiK ]
——
非商业转载请附原文链接!
商业转载请获得博主许可!