数据结构_我不会AVL_wbhavl

问题描述

  欢迎来到暴走数据结构,我是洪尼玛。今天,我们来玩 AVL 树,怎么玩呢? 很简单:给
你 n 个数字,你需要按顺序插入一棵 AVL树中,然后输出每个数所在节点的深度(从 1 开始)。
因为我不会 AVL 树,所以希望聪明的你们来帮我完成这个任务


★数据输入
输入第一个数为 n(n100000) 表示数字的个数
接下来一行输入 n 个数,范围在 1 到 n 之间,每个数只出现一次


★数据输出
按输入的顺序依次输出每个数所在节点的深度

输入示例 输出示例
6
1 2 3 4 5 6
3 2 3 1 2 3

 


★提示
注意: 输出行末不能有空格
对于 50%的数据, 1<=n<=100
对于 100%的数据, 1<=n<=100000

 

思路

  没说明技巧,就是avl树

  具体实现自行百度

code

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 #include <string.h>
  4 
  5 struct Node
  6 {
  7     int data;
  8     int height;
  9     int left;
 10     int right;
 11 };
 12 
 13 Node *arr = NULL;
 14 
 15 inline int Max(int a,int b) {return a>b?a:b;}
 16 inline int GetHeight(int root){
 17     return arr[root].height; //return root==0 ? 0 : arr[root]->height;
 18 }
 19 inline void CalcHeight(int root){
 20     arr[root].height = Max(GetHeight(arr[root].left),GetHeight(arr[root].right)) + 1;
 21 }
 22 //------------------------------------------------------------------------------------
 23 int RightRotate(int root)
 24 {
 25     int newroot = arr[root].left;
 26     arr[root].left = arr[newroot].right;
 27     arr[newroot].right = root;
 28     CalcHeight(root);
 29     CalcHeight(newroot);
 30     return newroot;
 31 }
 32 int LeftRotate(int root)
 33 {
 34     int newroot = arr[root].right;
 35     arr[root].right = arr[newroot].left;
 36     arr[newroot].left = root;
 37     CalcHeight(root);
 38     CalcHeight(newroot);
 39     return newroot;
 40 }
 41 int LeftRightRotate(int root)
 42 {
 43     arr[root].left = LeftRotate(arr[root].left);
 44     return RightRotate(root);
 45 }
 46 int RightLeftRotate(int root)
 47 {
 48     arr[root].right = RightRotate(arr[root].right);
 49     return LeftRotate(root);
 50 }
 51 //------------------------------------------------------------------------------------
 52 int Insert(int root, int data)
 53 {
 54     if(root==0)
 55     {
 56         arr[data].data = data;
 57         arr[data].height = 1;
 58         return data;
 59     }
 60     else if(data < arr[root].data)
 61     {
 62         arr[root].left = Insert(arr[root].left,data);
 63         if(GetHeight(arr[root].left) - GetHeight(arr[root].right) >= 2)
 64         {
 65             if(data < arr[arr[root].left].data)
 66                 root = RightRotate(root);
 67             else//if(data > arr[arr[root]->left]->data)
 68                 root = LeftRightRotate(root);
 69         }
 70     }
 71     else if(data > arr[root].data)
 72     {
 73         arr[root].right = Insert(arr[root].right,data);
 74         if(GetHeight(arr[root].right) - GetHeight(arr[root].left) >= 2)
 75         {
 76             if(data > arr[arr[root].right].data)
 77                 root = LeftRotate(root);
 78             else//if(data < arr[arr[root]->right]->data)
 79                 root = RightLeftRotate(root);
 80         }
 81     }//else ==
 82     CalcHeight(root);
 83     return root;
 84 }
 85 
 86 void dfs(int index,int step)
 87 {
 88     if(index==0) return;
 89     arr[index].height = step;
 90     dfs(arr[index].left,step+1);
 91     dfs(arr[index].right,step+1);
 92 }
 93 
 94 int main()
 95 {
 96     int n;
 97     scanf("%d",&n);
 98     int *data = (int *)malloc(sizeof(int)*(n+1));
 99     arr = (Node *)malloc(sizeof(Node)*(n+1));
100     memset(arr,0,sizeof(Node)*(n+1));
101     //------------------------------------------------
102     int root = 0;
103     int i;
104     for(i=0; i<n; i++)
105     {
106         scanf("%d",data+i);
107         root = Insert(root,data[i]);
108     }
109     dfs(root,1);
110     for(i=0; i<n; i++)
111     {
112         if(i==n-1)
113             printf("%d\n",arr[data[i]].height);
114         else
115             printf("%d ",arr[data[i]].height);
116     }
117     
118     //------------------------------------------------
119     free(arr);
120     free(data);
121     return 0;
122 }

 

posted @ 2017-11-23 13:24  cbattle  阅读(1174)  评论(0编辑  收藏  举报