04-树5 Root of AVL Tree
2015-11-04 12:38
766 查看
04-树5 Root of AVL Tree (25分)
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.
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.
For each test case, print the root of the resulting AVL tree in one line.
思路:
基础题,建一个AVL树
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 the 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树
#include <iostream> using namespace std; typedef struct TNode* AVLTree; struct TNode { int height; AVLTree left; AVLTree right; int data; }; int Max(int x,int y) { int q; x>y?q=x:q=y; return q; } int Height(AVLTree t) { if(t == NULL) return -1; else return t->height; } AVLTree SingleRotateWithLeft(AVLTree T) //LL { AVLTree k; k = T->left; T->left = k->right; k->right = T; k->height = Max(Height(k->left), Height(k->right)) + 1; T->height = Max(Height(T->left), Height(T->right)) + 1; return k; } AVLTree SingleRotateWithRight(AVLTree T) //RR { AVLTree k; k = T->right; T->right = k->left; k->left = T; k->height = Max(Height(k->left), Height(k->right)) + 1; T->height = Max(Height(T->left), Height(T->right)) + 1; return k; } AVLTree DoubleRotateWithLeft(AVLTree T) //LR { T->left = SingleRotateWithRight(T->left); T = SingleRotateWithLeft(T); return T; } AVLTree DoubleRotateWithRight(AVLTree T) //RL { T->right = SingleRotateWithLeft(T->right); T = SingleRotateWithRight(T); return T; } AVLTree Insert(AVLTree T, int x) { if(T == NULL) { T = new TNode; T->left = T->right = NULL; T->data = x; } else if(x < T->data) //left child { T->left = Insert(T->left, x); if(Height(T->left) - Height(T->right) == 2) { if(x < T->left->data) T = SingleRotateWithLeft(T);//LL else if(x > T->left->data) T = DoubleRotateWithLeft(T);//LR } } else if(x > T->data) //right child { T->right = Insert(T->right, x); if(Height(T->right) - Height(T->left) == 2) { if(x > T->right->data) T = SingleRotateWithRight(T);//RR else if(x < T->right->data) T = DoubleRotateWithRight(T);//RL } } //update T's height T->height = Max(Height(T->left), Height(T->right)) + 1; return T; } int main() { int n,x; AVLTree T = NULL; cin>>n; for(int i=0; i<n; i++) { cin>>x; T = Insert(T,x); } cout << T->data << endl; return 0; }
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- 关于指针的一些事情
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- Lua中调用C++函数示例
- Lua教程(一):在C++中嵌入Lua脚本
- Lua教程(七):数据结构详解
- Lua教程(二):C++和Lua相互传递数据示例
- 解析从源码分析常见的基于Array的数据结构动态扩容机制的详解
- C#数据结构揭秘一
- C#实现获取系统目录并以Tree树叉显示的方法
- C++联合体转换成C#结构的实现方法
- C++编写简单的打靶游戏
- C++ 自定义控件的移植问题
- C++变位词问题分析
- C/C++数据对齐详细解析
- C++基于栈实现铁轨问题
- C++中引用的使用总结
- 使用Lua来扩展C++程序的方法
- C++中调用Lua函数实例