博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
AVL树
阅读量:5019 次
发布时间:2019-06-12

本文共 4628 字,大约阅读时间需要 15 分钟。

AVL树是一种自平衡二叉查找树。它的平衡因子等于它的左子树的高度减去它的右子树的高度。只有平衡因子等于1,0,-1的结点是平衡的,不平衡的结点需要通过旋转来保持平衡。因此,在AVL树中任何结点的两个子树的高度差的最大值为1。

google到了一篇代码很简洁易懂的文章,将其中的代码整理了一下:

1 //AVL Tree  2 #include 
3 #include
4 using namespace std; 5 6 typedef int Type; 7 8 struct avl_node{ 9 Type data; 10 avl_node *lchild, *rchild; 11 }*root; 12 13 14 class avlTree{ 15 public: 16 avlTree(){ 17 root=NULL; 18 } 19 20 ~avlTree(){ 21 delete_tree(root); 22 } 23 24 void delete_tree(avl_node *node){ 25 if(node->lchild!=NULL){ 26 delete_tree(node->lchild); 27 } 28 if(node->rchild!=NULL){ 29 delete_tree(node->rchild); 30 } 31 delete node; 32 node=NULL; 33 } 34 35 //get height of a node 36 //the height of one single node is 1 (not 0) 37 int height(avl_node* node){ 38 if(node==NULL) return 0; 39 int left_h=height(node->lchild); 40 int right_h=height(node->rchild); 41 return max(left_h,right_h)+1; 42 } 43 44 //get difference of height of the node's left tree and right tree 45 //node will not be NULL 46 //calculated by left-right 47 int diff(avl_node* node){ 48 int left_h=height(node->lchild); 49 int right_h=height(node->rchild); 50 return left_h-right_h; 51 } 52 53 avl_node* RR_rotation(avl_node* head){ 54 avl_node* temp=head->rchild; 55 head->rchild=temp->lchild; 56 temp->lchild=head; 57 return temp; 58 } 59 60 avl_node* LL_rotation(avl_node* head){ 61 avl_node* temp=head->lchild; 62 head->lchild=temp->rchild; 63 temp->rchild=head; 64 return temp; 65 } 66 67 avl_node* LR_rotation(avl_node* head){ 68 head->lchild=RR_rotation(head->lchild); 69 return LL_rotation(head); 70 } 71 72 avl_node* RL_rotation(avl_node* head){ 73 head->rchild=LL_rotation(head->rchild); 74 return RR_rotation(head); 75 } 76 77 //recursively check and keep the tree balanced 78 avl_node* balance(avl_node* head){ 79 int bal_factor=diff(head); 80 //balance factor==2 81 if(bal_factor>1){ 82 if(diff(head->lchild)>0){ 83 head=LL_rotation(head); 84 } 85 else{ 86 head=LR_rotation(head); 87 } 88 } 89 //balance factor=-2 90 else if(bal_factor<-1){ 91 if(diff(head->rchild)>0){ 92 head=RL_rotation(head); 93 } 94 else{ 95 head=RR_rotation(head); 96 } 97 } 98 return head; 99 }100 101 avl_node* insert(avl_node* root, Type value){102 if(root==NULL){103 root=new avl_node;104 root->data=value;105 root->lchild=NULL;106 root->rchild=NULL;107 return root;108 }109 else if(value
data){110 root->lchild=insert(root->lchild,value);111 root=balance(root);112 }113 else if(value>root->data){114 root->rchild=insert(root->rchild,value);115 root=balance(root);116 }117 return root;118 }119 120 //an interesting way to display the tree horizontally121 void display(avl_node* cur, int level){122 if(cur!=NULL){123 display(cur->rchild, level+1);124 cout<
";127 }128 for(int i=0;i
data;132 display(cur->lchild, level+1);133 }134 }135 136 void preorder(avl_node* cur){137 if(cur==NULL) return;138 cout<
data<<" ";139 preorder(cur->lchild);140 preorder(cur->rchild);141 }142 143 void inorder(avl_node* cur){144 if(cur==NULL) return;145 inorder(cur->lchild);146 cout<
data<<" ";147 inorder(cur->rchild);148 }149 150 void postorder(avl_node* cur){151 if(cur==NULL) return;152 postorder(cur->lchild);153 postorder(cur->rchild);154 cout<
data<<" ";155 }156 };157 158 159 160 //for testing161 int main()162 {163 int choice;164 Type item;165 avlTree avl;166 while (1)167 {168 cout<<"\n---------------------"<
>choice;179 switch(choice)180 {181 case 1:182 cout<<"Enter value to be inserted: ";183 cin>>item;184 root = avl.insert(root, item);185 break;186 case 2:187 if (root == NULL)188 {189 cout<<"Tree is Empty"<

 

测试结果和原文请见:

 

转载于:https://www.cnblogs.com/NoviScl/p/7055863.html

你可能感兴趣的文章
MSF Project Management Discipline
查看>>
asp.net js调用后台方法
查看>>
用户佐证
查看>>
python 元组 列表 字典基础分析:
查看>>
设计模式之--模板模式(Templete)
查看>>
JavaSript模块规范 - AMD规范与CMD规范介绍
查看>>
类加载过程和对象创建过程
查看>>
【列表迭代器】
查看>>
ubuntu:pkg install -forge io : please install the Debian package "liboctave-dev" to get the mkoc...
查看>>
C++ STL疑惑知识点
查看>>
最长回文字符串
查看>>
对称字符串的最大长度
查看>>
Docker背后的容器管理——Libcontainer深度解析
查看>>
node.js实现http服务器进行访问
查看>>
【LR9】【LOJ561】CommonAnts 的调和数 数论 筛法
查看>>
摇奖-大转盘-js内容
查看>>
SQL:将字符串以特定字符分割并返回Table
查看>>
Silverlight中操作Xml
查看>>
Boring counting HDU - 3518 (后缀自动机)
查看>>
java_运算符
查看>>