PAT A 1066. Root of AVL Tree (25)

来源:互联网 发布:php用户管理系统代码 编辑:程序博客网 时间:2024/06/06 08:05

题目

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 120

Sample Output 1:

70

Sample Input 2:

788 70 61 96 120 90 65

Sample Output 2:

88

 

平衡二叉树调整问题

 

代码:

#include <iostream>#include <cstdio>#include <algorithm>using namespace std;struct node//树中的点{node *left;node *right;int val;//值int height;//高度,从0开始计数node(int v=0,node *l=NULL,node *r=NULL,int h=0):val(v),left(l),right(r),height(h){};};int Get_height(node *n);//返回高度,可以处理NULLbool Is_balance(node *l,node *r);//是否平衡node* insert(node *root,int val);//将val插入以root为根的平衡树中node* Rotleft(node *root);//左转node* Rotright(node *root);//右转int main(){int n;cin>>n;int i,temp;node *root=NULL;for(i=0;i<n;i++){scanf("%d",&temp);root=insert(root,temp);}cout<<root->val;return 0;}int Get_height(node *n){if(n==NULL)return -1;elsereturn n->height;}bool Is_balance(node *l,node *r){return abs(Get_height(l)-Get_height(r))<2;}node* insert(node *root,int val)//递归调用,直到获得NULL,即插入位置{if(root==NULL){root=new node(val);return root;}if(val<root->val)//比值小,插入到左子树中{root->left=insert(root->left,val);if(!Is_balance(root->left,root->right))//保持平衡性{if(val<root->left->val)//插入在左子树的左子树root=Rotright(root);else//插入在左子树的右子树{root->left=Rotleft(root->left);root=Rotright(root);}}}else//比值大,插入到右子树中{root->right=insert(root->right,val);if(!Is_balance(root->left,root->right))//保持平衡性{if(val>root->right->val)//插入在右子树的右子树root=Rotleft(root);else//插入在右子树的左子树{root->right=Rotright(root->right);root=Rotleft(root);}}}root->height=max(Get_height(root->left),Get_height(root->right))+1;return root;}node* Rotleft(node *root)//节点左转{node *t=root->right;root->right=t->left;t->left=root;root->height=max(Get_height(root->left),Get_height(root->right))+1;t->height=max(Get_height(t->left),Get_height(t->right))+1;return t;}node* Rotright(node *root)//节点右转{node *t=root->left;root->left=t->right;t->right=root;root->height=max(Get_height(root->left),Get_height(root->right))+1;t->height=max(Get_height(t->left),Get_height(t->right))+1;return t;}


 

 

 

0 0
原创粉丝点击