1066. Root of AVL Tree (25)

Posted lan126

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1066. Root of AVL Tree (25)相关的知识,希望对你有一定的参考价值。

距离PAT考试还有 11天最重要的是做透每一题

 

(1)思路

就是考察基本的AVL树

 

这里主要写的是单旋转左旋和右旋 

双旋转可以用其组合得到

 

这里要注意的是,insert,roatewithleftchild和roatewithrightchild函数都是传的引用,root初始化为0,表示插入的位置到了

所以root的值会不断改变为当前树的根

 

按照这个思路必须将left,right数组初始为零

顺便为了好看,可以规定height[0]为-1

#include <cstdio>
#include <vector>
#include <cstring>
#include <algorithm>
using namespace std;

int n;
int num=0;
const int N=30;
int a[N];
int left[N];
int right[N];
int height[N];

int newnode(int x) {
  num++;
  a[num]=x;
  left[num]=0;
  right[num]=0;
  height[num]=0;
  return num;
}

void roatewithleftchild(int& p) {
  int q=left[p];
  left[p]=right[q];
  right[q]=p;
  height[p]=max(height[left[p]],height[right[p]])+1;
  height[q]=max(height[left[q]],height[p]);
  p=q;
}

void roatewithrightchild(int& p) {
  int q=right[p];
  right[p]=left[q];
  left[q]=p;
  height[p]=max(height[left[p]],height[right[p]])+1;
  height[q]=max(height[right[q]],height[p]);
  p=q;
}

void insert(int x,int& p) {
  if(!p) p=newnode(x);
  else if(x < a[p]){
    insert(x,left[p]);
    // 
    if(height[left[p]] - height[right[p]] == 2) {
      if(x < a[left[p]]) roatewithleftchild(p);
      else {
    roatewithrightchild(left[p]);
    roatewithleftchild(p);
      }
    }
  } else if(x > a[p]) {
    insert(x,right[p]); 
    if(height[right[p]] - height[left[p]] == 2) {
      if(x > a[right[p]]) roatewithrightchild(p);
      else {//left-right roate
    roatewithleftchild(right[p]);
    roatewithrightchild(p);
      }
    }
  }
  height[p]=max(height[left[p]],height[right[p]])+1;
}

int main() {
  scanf("%d",&n);
  memset(a,0,sizeof(a));
  memset(left,0,sizeof(left));
  memset(right,0,sizeof(right));
  memset(height,-1,sizeof(height));
  int root=0;
  for(int i=0;i<n;i++) {
    int v;
    scanf("%d",&v);
    insert(v,root);
  }
  printf("%d\\n",a[root]);
  return 0;
}

 

 

以上是关于1066. Root of AVL Tree (25)的主要内容,如果未能解决你的问题,请参考以下文章

1066 Root of AVL Tree (25)

PAT 1066. Root of AVL Tree

A1066. Root of AVL Tree

1066 Root of AVL Tree

PAT 甲级 1066 Root of AVL Tree

PAT_A1066#Root of AVL Tree