PAT 数据结构 04-树4. Root of AVL Tree (25)
来源:互联网 发布:淘宝鞋子质量好的店铺 编辑:程序博客网 时间:2024/05/18 06:23
An AVL tree is a self-balancing binary search tree. In an AVL tree, the heights of the two child subtrees of any node differ by at most one; if at any time they differ by more than one, rebalancing is done to restore this property. Figures 1-4 illustrate the rotation rules.
Now given a sequence of insertions, you are supposed to tell the root of the resulting AVL tree.
Input Specification:
Each input file contains one test case. For each case, the first line contains a positive integer N (<=20) which is the total number of keys to be inserted. Then N distinct integer keys are given in the next line. All the numbers in a line are separated by a space.
Output Specification:
For each test case, print ythe root of the resulting AVL tree in one line.
Sample Input 1:588 70 61 96 120Sample Output 1:
70Sample Input 2:
788 70 61 96 120 90 65Sample Output 2:
88
在插入一个新结点时,有四种情况会导致AVL树失去平衡,分别为左子树外侧,左子树内侧,右子树外侧,右子树内侧;外侧的情况比较简单,对根结点一次单旋转即可使树平衡,内侧的情况需要两次单旋转,首先将与根结点的值最接近的结点旋转为根结点的子结点,然后对根节点进行一次单旋转。
创建树时使用递归找到插入点,然后判断AVL树是否失去平衡(左右子树的高度差变为2),若失衡,则从插入点递归返回二级或三级父结点会检测到,判断是四种情况中的哪种,并作相应处理。/*2015.7.11*/#include <iostream>#include <vector>using namespace std;//Tree-04 AVL Treestruct TNode{int val;TNode* left;TNode* right;TNode(int x):val(x),left(nullptr),right(nullptr){}};int height(TNode *&root){if(root==nullptr)return 0;elsereturn max(height(root->left),height(root->right))+1;}TNode* singleRotateWithLeft(TNode* &root){//左外侧太深,单旋转TNode* tmp=root->left;root->left=tmp->right;tmp->right=root;return tmp;}TNode* singleRotateWithRight(TNode* &root){TNode* tmp=root->right;root->right=tmp->left;tmp->left=root;return tmp;}TNode* doubleRotateWithLeft(TNode* &root){//左内侧太深,双旋转root->left=singleRotateWithRight(root->left);return singleRotateWithLeft(root);}TNode* doubleRotateWithRight(TNode* &root){root->right=singleRotateWithLeft(root->right);return singleRotateWithRight(root);}TNode* insert(TNode *root,int x){if(root==nullptr){root=new TNode(x);}else if(x< root->val){root->left=insert(root->left,x);if(height(root->left)-height(root->right)==2){if(x< root->left->val)root=singleRotateWithLeft(root);elseroot=doubleRotateWithLeft(root);}}else{root->right=insert(root->right,x);if(height(root->right)-height(root->left)==2){if(x> root->right->val)root=singleRotateWithRight(root);elseroot=doubleRotateWithRight(root);}}return root;}/* test rotatevoid preCreateTree(TNode *&root,int *&p){if(*p==0){root=nullptr;p++;}else{root=new TNode(*p);p++;preCreateTree(root->left,p);preCreateTree(root->right,p);}}void preorder(TNode *&root){if(root!=nullptr){cout<<root->val<<endl;preorder(root->left);preorder(root->right);}}*/int main(){int N;cin>>N;int x;TNode *root=nullptr;while(N--){cin>>x;root=insert(root,x);}cout<<root->val<<endl;/* test rotateint a[]={4,2,1,0,0,3,0,0,6,5,0,0,7,0,0};int *p=a;TNode* root;preCreateTree(root,p);root=singleRotateWithLeft(root);preorder(root);root->right=singleRotateWithRight(root->right);preorder(root);root=doubleRotateWithRight(root);preorder(root);*/return 0;}
- PAT 数据结构 04-树4. Root of AVL Tree (25)
- PAT 1066. Root of AVL Tree (25) (AVL树)
- 【PAT】1066. Root of AVL Tree (25)
- 【PAT】1066. Root of AVL Tree (25)
- PAT 1066. Root of AVL Tree (25)
- PAT 1066. Root of AVL Tree (25)
- pat 1066. Root of AVL Tree (25)
- PAT A1066. Root of AVL Tree (25)
- PAT A1066. Root of AVL Tree (25)
- 04-树4. Root of AVL Tree
- pat甲1066. Root of AVL Tree(AVL树)
- pat甲 1066. Root of AVL Tree (AVL树)
- 04-树4. Root of AVL Tree (25)
- 04-树4. Root of AVL Tree (25)
- 04-树4. Root of AVL Tree (25)
- PAT (Advanced Level) 1066. Root of AVL Tree (25) AVL树的插入建树
- 1066. Root of AVL Tree (25)【AVL树】——PAT (Advanced Level) Practise
- PAT A 1066. Root of AVL Tree (25)
- Android Application详解
- JDBC问题总结
- 孪生素数问题
- Cocos2d-x中的坐标系
- 正则表达式12
- PAT 数据结构 04-树4. Root of AVL Tree (25)
- vim 复制
- cocos2d-js(一)引擎的工作原理和文件的调用顺序
- win32汇编 数据类型及定义
- 在樱花vps上安装win系统(下)
- 有趣的数
- windows平台多线程同步之Mutex的应用
- 自定义二级联动
- 【算法设计与分析基础】高斯消元