PAT (Advanced Level) 1066. Root of AVL Tree (25) AVL树的插入建树
2015-07-28 15:32
609 查看
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:
Sample Output 1:
Sample Input 2:
Sample Output 2:
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:
5 88 70 61 96 120
Sample Output 1:
70
Sample Input 2:
7 88 70 61 96 120 90 65
Sample Output 2:
88
在插入一个新结点时,有四种情况会导致AVL树失去平衡,分别为左子树外侧,左子树内侧,右子树外侧,右子树内侧;外侧的情况比较简单,对根结点一次单旋转即可使树平衡,内侧的情况需要两次单旋转,首先将与根结点的值最接近的结点旋转为根结点的子结点,然后对根节点进行一次单旋转。
创建树时使用递归找到插入点,然后判断AVL树是否失去平衡(左右子树的高度差变为2),若失衡,判断是四种情况中的哪种,并作相应处理。
/*2015.7.28cyq*/ #include <iostream> #include <vector> using namespace std; struct 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; else return max(height(root->left),height(root->right))+1; } TNode* singleRotateLeft(TNode* &root){//左子树外侧太深,单旋转 TNode* tmp=root->left; root->left=tmp->right; tmp->right=root; return tmp; } TNode* singleRotateRight(TNode* &root){//右子树外侧太深,单旋转 TNode* tmp=root->right; root->right=tmp->left; tmp->left=root; return tmp; } //双旋转时,先将待旋转子树中与root最接近的旋转为root的子结点,然后对root单旋转 TNode* doubleRotateLeft(TNode* &root){//左子树内侧太深,双旋转 root->left=singleRotateRight(root->left); return singleRotateLeft(root); } TNode* doubleRotateRight(TNode* &root){//右子树内侧太深,双旋转 root->right=singleRotateLeft(root->right); return singleRotateRight(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=singleRotateLeft(root); else root=doubleRotateLeft(root); } }else{ root->right=insert(root->right,x); if(height(root->right)-height(root->left)==2){ if(x> root->right->val) root=singleRotateRight(root); else root=doubleRotateRight(root); } } return root; } int main(){ int N; cin>>N; TNode *root=nullptr; int x; while(N--){ cin>>x; root=insert(root,x); } cout<<root->val; return 0; }
相关文章推荐
- POJ 1256 Anagram
- 【图论】【二分图匹配】[POJ 3041]I'm Telling the Truth
- iOS 点击TextField不弹出软键盘的解决方案
- ASP.NET前台AJAX方法调用后台的方法写法
- JavaScript高级程序设计(第三版)学习笔记(1)
- EM算法
- easyui-combobox加载json中对象的属性(转)
- GID SID AID HID
- 使用Browserify配合jQuery进行编程的超级指南
- ScrollView的滑动时的下拉距离的响应事件。
- SQL注入学习笔记(一)
- VOA 2015-07-26
- 从Trie树(字典树)谈到后缀树
- c++<vector>AND<array>
- shell 确定脚本文件所在的路径
- CentOS7.1配置远程桌面
- 欢迎使用CSDN-markdown编辑器
- VS2010+DCMTK3.6.0 : MT支持库 安装说明
- 【问题及解决】Elasticsearch不能正常启动do not exists on master, act as master failure
- 监控 Linux 系统的 7 个命令行工具